yonghong-song 8aae191cb6
[BPF] Remove 'may_goto 0' instructions (#123482)
Emil Tsalapatis from Meta reported such a case where 'may_goto 0' insn
is generated by clang compiler. But 'may_goto 0' insn is actually a
no-op so it makes sense to remove that in llvm. The patch is also able
to handle the following code pattern
```
   ...
   may_goto 2
   may_goto 1
   may_goto 0
   ...
```
where three may_goto insns can all be removed.

---------

Co-authored-by: Yonghong Song <yonghong.song@linux.dev>
2025-01-28 15:19:05 -08:00

28 lines
1.1 KiB
LLVM

; RUN: llc -mtriple=bpfel -mcpu=v3 -filetype=obj -o - %s | llvm-objdump --no-show-raw-insn -d - | FileCheck %s
@j = dso_local local_unnamed_addr global i32 0, align 4
define dso_local noundef i32 @foo() local_unnamed_addr {
entry:
callbr void asm sideeffect "may_goto $0", "!i"()
to label %for.body [label %for.cond.cleanup]
for.cond.cleanup: ; preds = %for.body.2, %for.body.2, %for.body.1, %for.body, %entry
ret i32 0
for.body: ; preds = %entry
callbr void asm sideeffect "may_goto $0", "!i"()
to label %for.body.1 [label %for.cond.cleanup]
for.body.1: ; preds = %for.body
callbr void asm sideeffect "may_goto $0", "!i"()
to label %for.body.2 [label %for.cond.cleanup]
for.body.2: ; preds = %for.body.1
callbr void asm sideeffect "may_goto $0", "!i"()
to label %for.cond.cleanup [label %for.cond.cleanup]
}
; CHECK: 0: w0 = 0x0
; CHECK-NEXT: 1: exit