Issue 142242
Summary Empty basic blocks with unconditional branches aren't eliminated
Labels new issue
Assignees
Reporter ashivaram23
    The following function calculates `a && b`:

```llvm
define i1 @a_and_b(i1 %a) {
start:
  br i1 %a, label %a_is_true, label %a_or_b_is_false

a_is_true:
  %b = call i1 @get_b()
 br i1 %b, label %end, label %a_or_b_is_false

a_or_b_is_false:
  br label %end

end:
  %retval = phi i1 [ true, %a_is_true ], [ false, %a_or_b_is_false ]
  ret i1 %retval
}

declare i1 @get_b()
```

No `-O3` pass is able to remove the `a_or_b_is_false` block, resulting in more assembly instructions than needed:

```nasm
_a_and_b:
  push rbx
  test dil, 1
  je LBB0_2
  mov bl, 1
  call _get_b
  test al, 1
  jne LBB0_3
LBB0_2:
  xor ebx, ebx
LBB0_3:
  mov eax, ebx
  pop rbx
 ret
```

Instead, the function should become something like

```llvm
define i1 @a_and_b(i1 %a) {
start:
  br i1 %a, label %a_is_true, label %end

a_is_true:
  %b = tail call i1 @get_b()
  br label %end

end:
  %retval = phi i1 [ false, %start ], [ %b, %a_is_true ]
  ret i1 %retval
}
```

and generate x86 instructions like this:

```nasm
_a_and_b:
  test dil, 1
  jne _get_b
  xor eax, eax
 ret
```

That should mostly happen in SimplifyCFGPass. I think the fix could be as simple as removing the check for `BB->phis().empty()` in `CanRedirectPredsOfEmptyBBToSucc` in Transforms/Utils/Local.cpp. A comment there says "There must be phis in BB, otherwise BB will be merged into Succ directly," but that's not always true.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to