[InstCombine] fix another poison-unsafe select transformation
authorJuneyoung Lee <aqjune@gmail.com>
Sun, 7 Mar 2021 17:11:01 +0000 (02:11 +0900)
committerJuneyoung Lee <aqjune@gmail.com>
Sun, 7 Mar 2021 17:11:04 +0000 (02:11 +0900)
This fixes another unsafe select folding by disabling it if
EnableUnsafeSelectTransform is set to false.

EnableUnsafeSelectTransform's default value is true, hence it won't
affect generated code (unless the flag is explicitly set to false).

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
llvm/test/Transforms/InstCombine/select-safe-bool-transforms.ll

index f26c194..7d9383c 100644 (file)
@@ -2890,7 +2890,11 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
       // shortening paths for the values (this helps getUnderlyingObjects() for
       // example).
       if (TrueSI->getFalseValue() == FalseVal && TrueSI->hasOneUse()) {
-        Value *And = Builder.CreateAnd(CondVal, TrueSI->getCondition());
+        // Simply merging into and i1 isn't poison-safe. Do it only when
+        // EnableUnsafeSelectTransform is set.
+        Value *And = EnableUnsafeSelectTransform ?
+            Builder.CreateAnd(CondVal, TrueSI->getCondition()) :
+            Builder.CreateLogicalAnd(CondVal, TrueSI->getCondition());
         replaceOperand(SI, 0, And);
         replaceOperand(SI, 1, TrueSI->getTrueValue());
         return &SI;
@@ -2907,7 +2911,11 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
       }
       // select(C0, a, select(C1, a, b)) -> select(C0|C1, a, b)
       if (FalseSI->getTrueValue() == TrueVal && FalseSI->hasOneUse()) {
-        Value *Or = Builder.CreateOr(CondVal, FalseSI->getCondition());
+        // Simply merging into or i1 isn't poison-safe. Do it only when
+        // EnableUnsafeSelectTransform is set.
+        Value *Or = EnableUnsafeSelectTransform ?
+            Builder.CreateOr(CondVal, FalseSI->getCondition()) :
+            Builder.CreateLogicalOr(CondVal, FalseSI->getCondition());
         replaceOperand(SI, 0, Or);
         replaceOperand(SI, 2, FalseSI->getFalseValue());
         return &SI;
index fd1e1be..83275ec 100644 (file)
@@ -262,7 +262,7 @@ define i1 @land_land_right1(i1 %A, i1 %B) {
 }
 define i1 @land_land_right2(i1 %A, i1 %B) {
 ; CHECK-LABEL: @land_land_right2(
-; CHECK-NEXT:    [[TMP1:%.*]] = and i1 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
 ; CHECK-NEXT:    ret i1 [[TMP1]]
 ;
   %c = select i1 %B, i1 %A, i1 false
@@ -426,7 +426,7 @@ define i1 @lor_lor_right1(i1 %A, i1 %B) {
 }
 define i1 @lor_lor_right2(i1 %A, i1 %B) {
 ; CHECK-LABEL: @lor_lor_right2(
-; CHECK-NEXT:    [[TMP1:%.*]] = or i1 [[A:%.*]], [[B:%.*]]
+; CHECK-NEXT:    [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
 ; CHECK-NEXT:    ret i1 [[TMP1]]
 ;
   %c = select i1 %B, i1 true, i1 %A