[PATCH] D84003: [InstCombine] Fix replace select with Phis when branch has the same labels

Kirill via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 16 23:00:59 PDT 2020


kpolushin created this revision.
kpolushin added reviewers: mkazantsev, nikic, hfinkel, efriedma, spatel, xbolva00.
kpolushin added a project: LLVM.
Herald added subscribers: llvm-commits, hiraditya.

  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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D84003

Files:
  llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp


Index: llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -2469,6 +2469,10 @@
   } else
     return nullptr;
 
+  // If a branch goes to the same BB on both branches, ignore it
+  if (TrueSucc == FalseSucc)
+    return nullptr;
+
   // We want to replace select %cond, %a, %b with a phi that takes value %a
   // for all incoming edges that are dominated by condition `%cond == true`,
   // and value %b for edges dominated by condition `%cond == false`. If %a


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84003.278664.patch
Type: text/x-patch
Size: 651 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200717/ce6f7a9f/attachment-0001.bin>


More information about the llvm-commits mailing list