[llvm] 24ce194 - [InstCombine] generalize select + select/and/or folding using implied conditions
Juneyoung Lee via llvm-commits
llvm-commits at lists.llvm.org
Mon May 3 17:43:33 PDT 2021
Author: Juneyoung Lee
Date: 2021-05-04T09:42:06+09:00
New Revision: 24ce194cfe493bb743c288ed049fcd86c37aace2
URL: https://github.com/llvm/llvm-project/commit/24ce194cfe493bb743c288ed049fcd86c37aace2
DIFF: https://github.com/llvm/llvm-project/commit/24ce194cfe493bb743c288ed049fcd86c37aace2.diff
LOG: [InstCombine] generalize select + select/and/or folding using implied conditions
This patch optimizes the remaining possible cases in D101191 by generalizing isImpliedCondition()-based
foldings.
Assume that there is `op a, (select b, _, _)` where op is one of `and i1`, `or i1` or their select forms.
We can do the following optimization based on the result of `isImpliedCondition(a, b)`:
If a = true implies…
- b = true:
- select a, (select b, A, B), false => select a, A, false : https://alive2.llvm.org/ce/z/WCnZYh
- and a, (select b, A, B) => select a, A, false : https://alive2.llvm.org/ce/z/uZhcMG
- b = false:
- select a, (select b, A, B), false => select a, B, false : https://alive2.llvm.org/ce/z/c2hJpV
- and a, (select b, A, B) => select a, B, false : https://alive2.llvm.org/ce/z/5ggwMM
If a = false implies…
- b = true:
- select a, true, (select b, A, B) => select a, true, A : https://alive2.llvm.org/ce/z/tidKvH
- or a, (select b, A, B) => select a, true, A : https://alive2.llvm.org/ce/z/cC-uyb
- b = false:
- select a, true, (select b, A, B) => select a, true, B : https://alive2.llvm.org/ce/z/ZXpJq9
- or a, (select b, A, B) => select a, true, B : https://alive2.llvm.org/ce/z/hnDrJj
Reviewed By: nikic
Differential Revision: https://reviews.llvm.org/D101720
Added:
Modified:
llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
llvm/lib/Transforms/InstCombine/InstCombineInternal.h
llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
llvm/test/Transforms/InstCombine/select-safe-bool-transforms.ll
llvm/test/Transforms/InstCombine/select-safe-impliedcond-transforms.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 8c0d796ef1c9d..e2671734d0935 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -1876,6 +1876,19 @@ Instruction *InstCombinerImpl::visitAnd(BinaryOperator &I) {
if (Instruction *Z = narrowMaskedBinOp(I))
return Z;
+ if (I.getType()->isIntOrIntVectorTy(1)) {
+ if (auto *SI0 = dyn_cast<SelectInst>(Op0)) {
+ if (auto *I =
+ foldAndOrOfSelectUsingImpliedCond(Op1, *SI0, /* IsAnd */ true))
+ return I;
+ }
+ if (auto *SI1 = dyn_cast<SelectInst>(Op1)) {
+ if (auto *I =
+ foldAndOrOfSelectUsingImpliedCond(Op0, *SI1, /* IsAnd */ true))
+ return I;
+ }
+ }
+
if (Instruction *FoldedLogic = foldBinOpIntoSelectOrPhi(I))
return FoldedLogic;
@@ -2553,6 +2566,20 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
if (Value *V = SimplifyBSwap(I, Builder))
return replaceInstUsesWith(I, V);
+ Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
+ if (I.getType()->isIntOrIntVectorTy(1)) {
+ if (auto *SI0 = dyn_cast<SelectInst>(Op0)) {
+ if (auto *I =
+ foldAndOrOfSelectUsingImpliedCond(Op1, *SI0, /* IsAnd */ false))
+ return I;
+ }
+ if (auto *SI1 = dyn_cast<SelectInst>(Op1)) {
+ if (auto *I =
+ foldAndOrOfSelectUsingImpliedCond(Op0, *SI1, /* IsAnd */ false))
+ return I;
+ }
+ }
+
if (Instruction *FoldedLogic = foldBinOpIntoSelectOrPhi(I))
return FoldedLogic;
@@ -2577,7 +2604,6 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
}
// (A & C)|(B & D)
- Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
Value *A, *B, *C, *D;
if (match(Op0, m_And(m_Value(A), m_Value(C))) &&
match(Op1, m_And(m_Value(B), m_Value(D)))) {
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
index edf8f0f2782ad..56204db681299 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
+++ b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h
@@ -357,6 +357,13 @@ class LLVM_LIBRARY_VISIBILITY InstCombinerImpl final
Instruction *foldIntrinsicWithOverflowCommon(IntrinsicInst *II);
Instruction *foldFPSignBitOps(BinaryOperator &I);
+ // Optimize one of these forms:
+ // and i1 Op, SI / select i1 Op, i1 SI, i1 false (if IsAnd = true)
+ // or i1 Op, SI / select i1 Op, i1 true, i1 SI (if IsAnd = false)
+ // into simplier select instruction using isImpliedCondition.
+ Instruction *foldAndOrOfSelectUsingImpliedCond(Value *Op, SelectInst &SI,
+ bool IsAnd);
+
public:
/// Inserts an instruction \p New before instruction \p Old
///
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index dc723933e1eca..f5733b47d5d63 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -2586,6 +2586,48 @@ static Value *foldSelectWithFrozenICmp(SelectInst &Sel, InstCombiner::BuilderTy
return nullptr;
}
+Instruction *InstCombinerImpl::foldAndOrOfSelectUsingImpliedCond(Value *Op,
+ SelectInst &SI,
+ bool IsAnd) {
+ Value *CondVal = SI.getCondition();
+ Value *A = SI.getTrueValue();
+ Value *B = SI.getFalseValue();
+
+ assert(Op->getType()->isIntOrIntVectorTy(1) &&
+ "Op must be either i1 or vector of i1.");
+
+ Optional<bool> Res = isImpliedCondition(Op, CondVal, DL, IsAnd);
+ if (!Res)
+ return nullptr;
+
+ Value *Zero = Constant::getNullValue(A->getType());
+ Value *One = Constant::getAllOnesValue(A->getType());
+
+ if (*Res == true) {
+ if (IsAnd)
+ // select op, (select cond, A, B), false => select op, A, false
+ // and op, (select cond, A, B) => select op, A, false
+ // if op = true implies condval = true.
+ return SelectInst::Create(Op, A, Zero);
+ else
+ // select op, true, (select cond, A, B) => select op, true, A
+ // or op, (select cond, A, B) => select op, true, A
+ // if op = false implies condval = true.
+ return SelectInst::Create(Op, One, A);
+ } else {
+ if (IsAnd)
+ // select op, (select cond, A, B), false => select op, B, false
+ // and op, (select cond, A, B) => select op, B, false
+ // if op = true implies condval = false.
+ return SelectInst::Create(Op, B, Zero);
+ else
+ // select op, true, (select cond, A, B) => select op, true, B
+ // or op, (select cond, A, B) => select op, true, B
+ // if op = false implies condval = false.
+ return SelectInst::Create(Op, One, B);
+ }
+}
+
Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
Value *CondVal = SI.getCondition();
Value *TrueVal = SI.getTrueValue();
@@ -2709,6 +2751,11 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
replaceUse(*Y, FI);
return replaceInstUsesWith(SI, Op1);
}
+
+ if (auto *Op1SI = dyn_cast<SelectInst>(Op1))
+ if (auto *I = foldAndOrOfSelectUsingImpliedCond(CondVal, *Op1SI,
+ /* IsAnd */ IsAnd))
+ return I;
}
// select (select a, true, b), c, false -> select a, c, false
diff --git a/llvm/test/Transforms/InstCombine/select-safe-bool-transforms.ll b/llvm/test/Transforms/InstCombine/select-safe-bool-transforms.ll
index f86febaf95ee6..d1d1b74a9dd75 100644
--- a/llvm/test/Transforms/InstCombine/select-safe-bool-transforms.ll
+++ b/llvm/test/Transforms/InstCombine/select-safe-bool-transforms.ll
@@ -49,9 +49,7 @@ define i1 @land_band_left2(i1 %A, i1 %B) {
; (A land B) lor A
define i1 @land_lor_left1(i1 %A, i1 %B) {
; CHECK-LABEL: @land_lor_left1(
-; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
-; CHECK-NEXT: [[RES:%.*]] = or i1 [[C]], [[A]]
-; CHECK-NEXT: ret i1 [[RES]]
+; CHECK-NEXT: ret i1 [[A:%.*]]
;
%c = select i1 %A, i1 %B, i1 false
%res = select i1 %c, i1 true, i1 %A
@@ -71,9 +69,7 @@ define i1 @land_lor_left2(i1 %A, i1 %B) {
; (A land B) bor A
define i1 @land_bor_left1(i1 %A, i1 %B) {
; CHECK-LABEL: @land_bor_left1(
-; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
-; CHECK-NEXT: [[RES:%.*]] = or i1 [[C]], [[A]]
-; CHECK-NEXT: ret i1 [[RES]]
+; CHECK-NEXT: ret i1 [[A:%.*]]
;
%c = select i1 %A, i1 %B, i1 false
%res = or i1 %c, %A
@@ -129,9 +125,7 @@ define i1 @band_lor_left2(i1 %A, i1 %B) {
; (A lor B) land A
define i1 @lor_land_left1(i1 %A, i1 %B) {
; CHECK-LABEL: @lor_land_left1(
-; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = and i1 [[C]], [[A]]
-; CHECK-NEXT: ret i1 [[RES]]
+; CHECK-NEXT: ret i1 [[A:%.*]]
;
%c = select i1 %A, i1 true, i1 %B
%res = select i1 %c, i1 %A, i1 false
@@ -151,9 +145,7 @@ define i1 @lor_land_left2(i1 %A, i1 %B) {
; (A lor B) band A
define i1 @lor_band_left1(i1 %A, i1 %B) {
; CHECK-LABEL: @lor_band_left1(
-; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = and i1 [[C]], [[A]]
-; CHECK-NEXT: ret i1 [[RES]]
+; CHECK-NEXT: ret i1 [[A:%.*]]
;
%c = select i1 %A, i1 true, i1 %B
%res = and i1 %c, %A
@@ -309,9 +301,7 @@ define i1 @land_lor_right2(i1 %A, i1 %B) {
; A bor (A land B)
define i1 @land_bor_right1(i1 %A, i1 %B) {
; CHECK-LABEL: @land_bor_right1(
-; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false
-; CHECK-NEXT: [[RES:%.*]] = or i1 [[C]], [[A]]
-; CHECK-NEXT: ret i1 [[RES]]
+; CHECK-NEXT: ret i1 [[A:%.*]]
;
%c = select i1 %A, i1 %B, i1 false
%res = or i1 %A, %c
@@ -385,9 +375,7 @@ define i1 @lor_land_right2(i1 %A, i1 %B) {
; A band (A lor B)
define i1 @lor_band_right1(i1 %A, i1 %B) {
; CHECK-LABEL: @lor_band_right1(
-; CHECK-NEXT: [[C:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = and i1 [[C]], [[A]]
-; CHECK-NEXT: ret i1 [[RES]]
+; CHECK-NEXT: ret i1 [[A:%.*]]
;
%c = select i1 %A, i1 true, i1 %B
%res = and i1 %A, %c
diff --git a/llvm/test/Transforms/InstCombine/select-safe-impliedcond-transforms.ll b/llvm/test/Transforms/InstCombine/select-safe-impliedcond-transforms.ll
index a8f7d2527086d..730f568347d62 100644
--- a/llvm/test/Transforms/InstCombine/select-safe-impliedcond-transforms.ll
+++ b/llvm/test/Transforms/InstCombine/select-safe-impliedcond-transforms.ll
@@ -4,9 +4,7 @@
define i1 @a_true_implies_b_true(i8 %z, i1 %X, i1 %Y) {
; CHECK-LABEL: @a_true_implies_b_true(
; CHECK-NEXT: [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
-; CHECK-NEXT: [[B:%.*]] = icmp ugt i8 [[Z]], 10
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[B]], i1 [[X:%.*]], i1 [[Y:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 [[SEL]], i1 false
+; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 [[X:%.*]], i1 false
; CHECK-NEXT: ret i1 [[RES]]
;
%a = icmp ugt i8 %z, 20
@@ -39,9 +37,7 @@ define <2 x i1> @a_true_implies_b_true_vec(i8 %z0, <2 x i1> %X, <2 x i1> %Y) {
define i1 @a_true_implies_b_true2(i8 %z, i1 %X, i1 %Y) {
; CHECK-LABEL: @a_true_implies_b_true2(
; CHECK-NEXT: [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
-; CHECK-NEXT: [[B:%.*]] = icmp ugt i8 [[Z]], 10
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[B]], i1 [[X:%.*]], i1 [[Y:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = and i1 [[A]], [[SEL]]
+; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 [[X:%.*]], i1 false
; CHECK-NEXT: ret i1 [[RES]]
;
%a = icmp ugt i8 %z, 20
@@ -54,9 +50,7 @@ define i1 @a_true_implies_b_true2(i8 %z, i1 %X, i1 %Y) {
define i1 @a_true_implies_b_true2_comm(i8 %z, i1 %X, i1 %Y) {
; CHECK-LABEL: @a_true_implies_b_true2_comm(
; CHECK-NEXT: [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
-; CHECK-NEXT: [[B:%.*]] = icmp ugt i8 [[Z]], 10
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[B]], i1 [[X:%.*]], i1 [[Y:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = and i1 [[SEL]], [[A]]
+; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 [[X:%.*]], i1 false
; CHECK-NEXT: ret i1 [[RES]]
;
%a = icmp ugt i8 %z, 20
@@ -69,9 +63,7 @@ define i1 @a_true_implies_b_true2_comm(i8 %z, i1 %X, i1 %Y) {
define i1 @a_true_implies_b_false(i8 %z, i1 %X, i1 %Y) {
; CHECK-LABEL: @a_true_implies_b_false(
; CHECK-NEXT: [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
-; CHECK-NEXT: [[B:%.*]] = icmp ult i8 [[Z]], 10
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[B]], i1 [[X:%.*]], i1 [[Y:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 [[SEL]], i1 false
+; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 [[Y:%.*]], i1 false
; CHECK-NEXT: ret i1 [[RES]]
;
%a = icmp ugt i8 %z, 20
@@ -84,9 +76,7 @@ define i1 @a_true_implies_b_false(i8 %z, i1 %X, i1 %Y) {
define i1 @a_true_implies_b_false2(i8 %z, i1 %X, i1 %Y) {
; CHECK-LABEL: @a_true_implies_b_false2(
; CHECK-NEXT: [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
-; CHECK-NEXT: [[B:%.*]] = icmp eq i8 [[Z]], 10
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[B]], i1 [[X:%.*]], i1 [[Y:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = and i1 [[A]], [[SEL]]
+; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 [[Y:%.*]], i1 false
; CHECK-NEXT: ret i1 [[RES]]
;
%a = icmp ugt i8 %z, 20
@@ -99,9 +89,7 @@ define i1 @a_true_implies_b_false2(i8 %z, i1 %X, i1 %Y) {
define i1 @a_true_implies_b_false2_comm(i8 %z, i1 %X, i1 %Y) {
; CHECK-LABEL: @a_true_implies_b_false2_comm(
; CHECK-NEXT: [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 20
-; CHECK-NEXT: [[B:%.*]] = icmp eq i8 [[Z]], 10
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[B]], i1 [[X:%.*]], i1 [[Y:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = and i1 [[SEL]], [[A]]
+; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 [[Y:%.*]], i1 false
; CHECK-NEXT: ret i1 [[RES]]
;
%a = icmp ugt i8 %z, 20
@@ -114,9 +102,7 @@ define i1 @a_true_implies_b_false2_comm(i8 %z, i1 %X, i1 %Y) {
define i1 @a_false_implies_b_true(i8 %z, i1 %X, i1 %Y) {
; CHECK-LABEL: @a_false_implies_b_true(
; CHECK-NEXT: [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
-; CHECK-NEXT: [[B:%.*]] = icmp ult i8 [[Z]], 20
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[B]], i1 [[X:%.*]], i1 [[Y:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[SEL]]
+; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[X:%.*]]
; CHECK-NEXT: ret i1 [[RES]]
;
%a = icmp ugt i8 %z, 10
@@ -129,9 +115,7 @@ define i1 @a_false_implies_b_true(i8 %z, i1 %X, i1 %Y) {
define i1 @a_false_implies_b_true2(i8 %z, i1 %X, i1 %Y) {
; CHECK-LABEL: @a_false_implies_b_true2(
; CHECK-NEXT: [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
-; CHECK-NEXT: [[B:%.*]] = icmp ult i8 [[Z]], 20
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[B]], i1 [[X:%.*]], i1 [[Y:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = or i1 [[A]], [[SEL]]
+; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[X:%.*]]
; CHECK-NEXT: ret i1 [[RES]]
;
%a = icmp ugt i8 %z, 10
@@ -144,9 +128,7 @@ define i1 @a_false_implies_b_true2(i8 %z, i1 %X, i1 %Y) {
define i1 @a_false_implies_b_true2_comm(i8 %z, i1 %X, i1 %Y) {
; CHECK-LABEL: @a_false_implies_b_true2_comm(
; CHECK-NEXT: [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
-; CHECK-NEXT: [[B:%.*]] = icmp ult i8 [[Z]], 20
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[B]], i1 [[X:%.*]], i1 [[Y:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = or i1 [[SEL]], [[A]]
+; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[X:%.*]]
; CHECK-NEXT: ret i1 [[RES]]
;
%a = icmp ugt i8 %z, 10
@@ -159,9 +141,7 @@ define i1 @a_false_implies_b_true2_comm(i8 %z, i1 %X, i1 %Y) {
define i1 @a_false_implies_b_false(i8 %z, i1 %X, i1 %Y) {
; CHECK-LABEL: @a_false_implies_b_false(
; CHECK-NEXT: [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
-; CHECK-NEXT: [[B:%.*]] = icmp ugt i8 [[Z]], 20
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[B]], i1 [[X:%.*]], i1 [[Y:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[SEL]]
+; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[Y:%.*]]
; CHECK-NEXT: ret i1 [[RES]]
;
%a = icmp ugt i8 %z, 10
@@ -174,9 +154,7 @@ define i1 @a_false_implies_b_false(i8 %z, i1 %X, i1 %Y) {
define i1 @a_false_implies_b_false2(i8 %z, i1 %X, i1 %Y) {
; CHECK-LABEL: @a_false_implies_b_false2(
; CHECK-NEXT: [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
-; CHECK-NEXT: [[B:%.*]] = icmp ugt i8 [[Z]], 20
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[B]], i1 [[X:%.*]], i1 [[Y:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = or i1 [[A]], [[SEL]]
+; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[Y:%.*]]
; CHECK-NEXT: ret i1 [[RES]]
;
%a = icmp ugt i8 %z, 10
@@ -189,9 +167,7 @@ define i1 @a_false_implies_b_false2(i8 %z, i1 %X, i1 %Y) {
define i1 @a_false_implies_b_false2_comm(i8 %z, i1 %X, i1 %Y) {
; CHECK-LABEL: @a_false_implies_b_false2_comm(
; CHECK-NEXT: [[A:%.*]] = icmp ugt i8 [[Z:%.*]], 10
-; CHECK-NEXT: [[B:%.*]] = icmp ugt i8 [[Z]], 20
-; CHECK-NEXT: [[SEL:%.*]] = select i1 [[B]], i1 [[X:%.*]], i1 [[Y:%.*]]
-; CHECK-NEXT: [[RES:%.*]] = or i1 [[SEL]], [[A]]
+; CHECK-NEXT: [[RES:%.*]] = select i1 [[A]], i1 true, i1 [[Y:%.*]]
; CHECK-NEXT: ret i1 [[RES]]
;
%a = icmp ugt i8 %z, 10
More information about the llvm-commits
mailing list