Skip to content

Commit c989881

Browse files
committed
[InstCombine] Fix replace select with Phis when branch has the same labels
``` define i32 @test(i1 %cond) { entry: br i1 %cond, label %exit, label %exit exit: %result = select i1 %cond, i32 123, i32 456 ret i32 %result } ``` In this test, after applying transformation of replacing select with Phis, the result will be: ``` define i32 @test(i1 %cond) { entry: br i1 %cond, label %exit, label %exit exit: %result = i32 phi [123, %exit], [123, %exit] ret i32 %result } ``` That is, select is transformed into an invalid Phi, which will then be reduced to 123 and the second value will be lost. But it is worth noting that this problem will arise only if select is in the InstCombine worklist will be before the branch. Otherwise, InstCombine will replace the branch condition with false and transformation will not be applied. The fix is to check the target labels in the branch condition for equality. Patch By: Kirill Polushin Differential Revision: https://reviews.llvm.org/D84003 Reviewed By: mkazantsev
1 parent 4905536 commit c989881

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2469,6 +2469,10 @@ static Instruction *foldSelectToPhiImpl(SelectInst &Sel, BasicBlock *BB,
24692469
} else
24702470
return nullptr;
24712471

2472+
// Make sure the branches are actually different.
2473+
if (TrueSucc == FalseSucc)
2474+
return nullptr;
2475+
24722476
// We want to replace select %cond, %a, %b with a phi that takes value %a
24732477
// for all incoming edges that are dominated by condition `%cond == true`,
24742478
// and value %b for edges dominated by condition `%cond == false`. If %a

0 commit comments

Comments
 (0)