Skip to content

Commit 9579807

Browse files
committed
[InstCombine] Reduce nested logical operator if poison is implied
1 parent 05bb50e commit 9579807

File tree

3 files changed

+32
-27
lines changed

3 files changed

+32
-27
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2985,6 +2985,13 @@ Instruction *InstCombinerImpl::foldSelectOfBools(SelectInst &SI) {
29852985
return BinaryOperator::CreateOr(CondVal, FalseVal);
29862986
}
29872987

2988+
if (match(CondVal, m_OneUse(m_Select(m_Value(A), m_One(), m_Value(B)))) &&
2989+
impliesPoison(FalseVal, B)) {
2990+
// (A || B) || C --> A || (B | C)
2991+
return replaceInstUsesWith(
2992+
SI, Builder.CreateLogicalOr(A, Builder.CreateOr(B, FalseVal)));
2993+
}
2994+
29882995
if (auto *LHS = dyn_cast<FCmpInst>(CondVal))
29892996
if (auto *RHS = dyn_cast<FCmpInst>(FalseVal))
29902997
if (Value *V = foldLogicOfFCmps(LHS, RHS, /*IsAnd*/ false,
@@ -3026,6 +3033,13 @@ Instruction *InstCombinerImpl::foldSelectOfBools(SelectInst &SI) {
30263033
return BinaryOperator::CreateAnd(CondVal, TrueVal);
30273034
}
30283035

3036+
if (match(CondVal, m_OneUse(m_Select(m_Value(A), m_Value(B), m_Zero()))) &&
3037+
impliesPoison(TrueVal, B)) {
3038+
// (A && B) && C --> A && (B & C)
3039+
return replaceInstUsesWith(
3040+
SI, Builder.CreateLogicalAnd(A, Builder.CreateAnd(B, TrueVal)));
3041+
}
3042+
30293043
if (auto *LHS = dyn_cast<FCmpInst>(CondVal))
30303044
if (auto *RHS = dyn_cast<FCmpInst>(TrueVal))
30313045
if (Value *V = foldLogicOfFCmps(LHS, RHS, /*IsAnd*/ true,

llvm/test/Transforms/InstCombine/and-or-icmps.ll

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3042,10 +3042,8 @@ define i32 @icmp_slt_0_or_icmp_add_1_sge_100_i32_fail(i32 %x) {
30423042
define i1 @logical_and_icmps1(i32 %a, i1 %other_cond) {
30433043
; CHECK-LABEL: @logical_and_icmps1(
30443044
; CHECK-NEXT: entry:
3045-
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[A:%.*]], -1
3046-
; CHECK-NEXT: [[RET1:%.*]] = select i1 [[RET:%.*]], i1 [[CMP2]], i1 false
3047-
; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i32 [[A]], 10086
3048-
; CHECK-NEXT: [[RET2:%.*]] = select i1 [[RET1]], i1 [[CMP3]], i1 false
3045+
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[A:%.*]], 10086
3046+
; CHECK-NEXT: [[RET2:%.*]] = select i1 [[RET1:%.*]], i1 [[CMP3]], i1 false
30493047
; CHECK-NEXT: ret i1 [[RET2]]
30503048
;
30513049
entry:
@@ -3059,11 +3057,7 @@ entry:
30593057
define i1 @logical_and_icmps2(i32 %a, i1 %other_cond) {
30603058
; CHECK-LABEL: @logical_and_icmps2(
30613059
; CHECK-NEXT: entry:
3062-
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A:%.*]], -1
3063-
; CHECK-NEXT: [[LOGICAL_AND:%.*]] = select i1 [[OTHER_COND:%.*]], i1 [[CMP1]], i1 false
3064-
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[A]], 10086
3065-
; CHECK-NEXT: [[RET:%.*]] = select i1 [[LOGICAL_AND]], i1 [[CMP2]], i1 false
3066-
; CHECK-NEXT: ret i1 [[RET]]
3060+
; CHECK-NEXT: ret i1 false
30673061
;
30683062
entry:
30693063
%cmp1 = icmp slt i32 %a, -1
@@ -3076,10 +3070,8 @@ entry:
30763070
define <4 x i1> @logical_and_icmps_vec1(<4 x i32> %a, <4 x i1> %other_cond) {
30773071
; CHECK-LABEL: @logical_and_icmps_vec1(
30783072
; CHECK-NEXT: entry:
3079-
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt <4 x i32> [[A:%.*]], <i32 -1, i32 -1, i32 -1, i32 -1>
3080-
; CHECK-NEXT: [[RET1:%.*]] = select <4 x i1> [[RET:%.*]], <4 x i1> [[CMP2]], <4 x i1> zeroinitializer
3081-
; CHECK-NEXT: [[CMP3:%.*]] = icmp slt <4 x i32> [[A]], <i32 10086, i32 10086, i32 10086, i32 10086>
3082-
; CHECK-NEXT: [[RET2:%.*]] = select <4 x i1> [[RET1]], <4 x i1> [[CMP3]], <4 x i1> zeroinitializer
3073+
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult <4 x i32> [[A:%.*]], <i32 10086, i32 10086, i32 10086, i32 10086>
3074+
; CHECK-NEXT: [[RET2:%.*]] = select <4 x i1> [[RET1:%.*]], <4 x i1> [[CMP3]], <4 x i1> zeroinitializer
30833075
; CHECK-NEXT: ret <4 x i1> [[RET2]]
30843076
;
30853077
entry:

llvm/test/Transforms/InstCombine/logical-select.ll

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1309,8 +1309,8 @@ define i1 @reduce_logical_and1(i1 %a, i32 %b, i32 %c) {
13091309
; CHECK-NEXT: bb:
13101310
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
13111311
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1312-
; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 [[CMP1]], i1 false
1313-
; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 [[CMP]], i1 false
1312+
; CHECK-NEXT: [[TMP0:%.*]] = and i1 [[CMP1]], [[CMP]]
1313+
; CHECK-NEXT: [[AND2:%.*]] = select i1 [[A:%.*]], i1 [[TMP0]], i1 false
13141314
; CHECK-NEXT: ret i1 [[AND2]]
13151315
;
13161316
bb:
@@ -1324,9 +1324,9 @@ bb:
13241324
define i1 @reduce_logical_and2(i1 %a, i1 %b, i1 %c) {
13251325
; CHECK-LABEL: @reduce_logical_and2(
13261326
; CHECK-NEXT: bb:
1327-
; CHECK-NEXT: [[CMP:%.*]] = xor i1 [[C:%.*]], [[B:%.*]]
1328-
; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1:%.*]], i1 [[CMP]], i1 false
1329-
; CHECK-NEXT: [[AND3:%.*]] = select i1 [[AND2]], i1 [[B]], i1 false
1327+
; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[C:%.*]], true
1328+
; CHECK-NEXT: [[B:%.*]] = and i1 [[TMP0]], [[B1:%.*]]
1329+
; CHECK-NEXT: [[AND3:%.*]] = select i1 [[AND2:%.*]], i1 [[B]], i1 false
13301330
; CHECK-NEXT: ret i1 [[AND3]]
13311331
;
13321332
bb:
@@ -1341,8 +1341,8 @@ define i1 @reduce_logical_and3(i1 %a, i32 %b, i32 noundef %c) {
13411341
; CHECK-NEXT: bb:
13421342
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
13431343
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1344-
; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 [[CMP]], i1 false
1345-
; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 [[CMP1]], i1 false
1344+
; CHECK-NEXT: [[TMP0:%.*]] = and i1 [[CMP]], [[CMP1]]
1345+
; CHECK-NEXT: [[AND2:%.*]] = select i1 [[A:%.*]], i1 [[TMP0]], i1 false
13461346
; CHECK-NEXT: ret i1 [[AND2]]
13471347
;
13481348
bb:
@@ -1358,8 +1358,8 @@ define i1 @reduce_logical_or1(i1 %a, i32 %b, i32 %c) {
13581358
; CHECK-NEXT: bb:
13591359
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
13601360
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1361-
; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[CMP1]]
1362-
; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 [[CMP]]
1361+
; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[CMP1]], [[CMP]]
1362+
; CHECK-NEXT: [[AND2:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[TMP0]]
13631363
; CHECK-NEXT: ret i1 [[AND2]]
13641364
;
13651365
bb:
@@ -1373,9 +1373,8 @@ bb:
13731373
define i1 @reduce_logical_or2(i1 %a, i1 %b, i1 %c) {
13741374
; CHECK-LABEL: @reduce_logical_or2(
13751375
; CHECK-NEXT: bb:
1376-
; CHECK-NEXT: [[CMP:%.*]] = xor i1 [[C:%.*]], [[B:%.*]]
1377-
; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1:%.*]], i1 true, i1 [[CMP]]
1378-
; CHECK-NEXT: [[AND3:%.*]] = select i1 [[AND2]], i1 true, i1 [[B]]
1376+
; CHECK-NEXT: [[B:%.*]] = or i1 [[C:%.*]], [[B1:%.*]]
1377+
; CHECK-NEXT: [[AND3:%.*]] = select i1 [[AND2:%.*]], i1 true, i1 [[B]]
13791378
; CHECK-NEXT: ret i1 [[AND3]]
13801379
;
13811380
bb:
@@ -1390,8 +1389,8 @@ define i1 @reduce_logical_or3(i1 %a, i32 %b, i32 noundef %c) {
13901389
; CHECK-NEXT: bb:
13911390
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], 6
13921391
; CHECK-NEXT: [[CMP1:%.*]] = icmp sgt i32 [[C:%.*]], [[B]]
1393-
; CHECK-NEXT: [[AND1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[CMP]]
1394-
; CHECK-NEXT: [[AND2:%.*]] = select i1 [[AND1]], i1 true, i1 [[CMP1]]
1392+
; CHECK-NEXT: [[TMP0:%.*]] = or i1 [[CMP]], [[CMP1]]
1393+
; CHECK-NEXT: [[AND2:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[TMP0]]
13951394
; CHECK-NEXT: ret i1 [[AND2]]
13961395
;
13971396
bb:

0 commit comments

Comments
 (0)