Skip to content

Commit 651073e

Browse files
aqjunememfrob
authored andcommitted
[InstCombine] Fully disable select to and/or i1 folding
This is a patch that disables the poison-unsafe select -> and/or i1 folding. It has been blocking D72396 and also has been the source of a few miscompilations described in llvm.org/pr49688 . D99674 conditionally blocked this folding and successfully fixed the latter one. The former one was still blocked, and this patch addresses it. Note that a few test functions that has `_logical` suffix are now deoptimized. These are created by @nikic to check the impact of disabling this optimization by copying existing original functions and replacing and/or with select. I can see that most of these are poison-unsafe; they can be revived by introducing freeze instruction. I left comments at fcmp + select optimizations (or-fcmp.ll, and-fcmp.ll) because I think they are good targets for freeze fix. Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D101191
1 parent 4a7ca8c commit 651073e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+486
-364
lines changed

clang/test/CodeGenOpenCL/amdgpu-nullptr.cl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@ int test_not_local_ptr(local char* p) {
598598
// CHECK-LABEL: test_and_ptr
599599
// CHECK: %[[tobool:.*]] = icmp ne i8 addrspace(5)* %p1, addrspacecast (i8* null to i8 addrspace(5)*)
600600
// CHECK: %[[tobool1:.*]] = icmp ne i8 addrspace(3)* %p2, addrspacecast (i8* null to i8 addrspace(3)*)
601-
// CHECK: %[[res:.*]] = and i1 %[[tobool]], %[[tobool1]]
601+
// CHECK: %[[res:.*]] = select i1 %[[tobool]], i1 %[[tobool1]], i1 false
602602
// CHECK: %[[land_ext:.*]] = zext i1 %[[res]] to i32
603603
// CHECK: ret i32 %[[land_ext]]
604604
int test_and_ptr(private char* p1, local char* p2) {

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,6 @@ using namespace PatternMatch;
4848

4949
#define DEBUG_TYPE "instcombine"
5050

51-
/// FIXME: Enabled by default until the pattern is supported well.
52-
static cl::opt<bool> EnableUnsafeSelectTransform(
53-
"instcombine-unsafe-select-transform", cl::init(true),
54-
cl::desc("Enable poison-unsafe select to and/or transform"));
55-
5651
static Value *createMinMax(InstCombiner::BuilderTy &Builder,
5752
SelectPatternFlavor SPF, Value *A, Value *B) {
5853
CmpInst::Predicate Pred = getMinMaxPred(SPF);
@@ -2664,32 +2659,14 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
26642659

26652660
if (SelType->isIntOrIntVectorTy(1) &&
26662661
TrueVal->getType() == CondVal->getType()) {
2667-
auto IsSafeToConvert = [&](Value *OtherVal) {
2668-
if (impliesPoison(OtherVal, CondVal))
2669-
return true;
2670-
2671-
if (!EnableUnsafeSelectTransform)
2672-
return false;
2673-
2674-
// We block this transformation if OtherVal or its operand can create
2675-
// poison. See PR49688
2676-
if (auto *Op = dyn_cast<Operator>(OtherVal)) {
2677-
if (canCreatePoison(Op))
2678-
return false;
2679-
if (propagatesPoison(Op) &&
2680-
llvm::any_of(Op->operand_values(), [](Value *V) {
2681-
return isa<Operator>(V) ? canCreatePoison(cast<Operator>(V))
2682-
: false;
2683-
}))
2684-
return false;
2685-
}
2686-
return true;
2687-
};
2688-
if (match(TrueVal, m_One()) && IsSafeToConvert(FalseVal)) {
2662+
// Folding select to and/or i1 isn't poison safe in general. impliesPoison
2663+
// checks whether folding it does not convert a well-defined value into
2664+
// poison.
2665+
if (match(TrueVal, m_One()) && impliesPoison(FalseVal, CondVal)) {
26892666
// Change: A = select B, true, C --> A = or B, C
26902667
return BinaryOperator::CreateOr(CondVal, FalseVal);
26912668
}
2692-
if (match(FalseVal, m_Zero()) && IsSafeToConvert(TrueVal)) {
2669+
if (match(FalseVal, m_Zero()) && impliesPoison(TrueVal, CondVal)) {
26932670
// Change: A = select B, C, false --> A = and B, C
26942671
return BinaryOperator::CreateAnd(CondVal, TrueVal);
26952672
}

llvm/test/Transforms/InstCombine/2008-02-28-OrFCmpCrash.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ define float @test_logical(float %x, x86_fp80 %y) nounwind readonly {
3333
; CHECK-NEXT: entry:
3434
; CHECK-NEXT: [[TMP67:%.*]] = fcmp uno x86_fp80 [[Y:%.*]], 0xK00000000000000000000
3535
; CHECK-NEXT: [[TMP71:%.*]] = fcmp uno float [[X:%.*]], 0.000000e+00
36-
; CHECK-NEXT: [[BOTHCOND:%.*]] = or i1 [[TMP67]], [[TMP71]]
36+
; CHECK-NEXT: [[BOTHCOND:%.*]] = select i1 [[TMP67]], i1 true, i1 [[TMP71]]
3737
; CHECK-NEXT: br i1 [[BOTHCOND]], label [[BB74:%.*]], label [[BB80:%.*]]
3838
; CHECK: bb74:
3939
; CHECK-NEXT: ret float 0.000000e+00

llvm/test/Transforms/InstCombine/2012-03-10-InstCombine.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ define i32 @func_logical(i8* %c, i8* %f) nounwind uwtable readnone noinline ssp
6060
; CHECK: if.then:
6161
; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i8* [[D]], [[F:%.*]]
6262
; CHECK-NEXT: [[NOT_CMP1:%.*]] = icmp uge i8* [[C]], [[F]]
63-
; CHECK-NEXT: [[DOTCMP2:%.*]] = and i1 [[CMP2]], [[NOT_CMP1]]
63+
; CHECK-NEXT: [[DOTCMP2:%.*]] = select i1 [[CMP2]], i1 [[NOT_CMP1]], i1 false
6464
; CHECK-NEXT: br label [[RETURN:%.*]]
6565
; CHECK: if.else:
6666
; CHECK-NEXT: [[CMP5:%.*]] = icmp uge i8* [[D]], [[F]]
6767
; CHECK-NEXT: [[NOT_CMP3:%.*]] = icmp ule i8* [[C]], [[F]]
68-
; CHECK-NEXT: [[DOTCMP5:%.*]] = and i1 [[CMP5]], [[NOT_CMP3]]
68+
; CHECK-NEXT: [[DOTCMP5:%.*]] = select i1 [[CMP5]], i1 [[NOT_CMP3]], i1 false
6969
; CHECK-NEXT: br label [[RETURN]]
7070
; CHECK: return:
7171
; CHECK-NEXT: [[RETVAL_0_IN:%.*]] = phi i1 [ [[DOTCMP2]], [[IF_THEN]] ], [ [[DOTCMP5]], [[IF_ELSE]] ]

llvm/test/Transforms/InstCombine/and-fcmp.ll

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,22 @@ define i1 @PR1738(double %x, double %y) {
1212
ret i1 %and
1313
}
1414

15+
; TODO: this can be supported by freezing %y
1516
define i1 @PR1738_logical(double %x, double %y) {
1617
; CHECK-LABEL: @PR1738_logical(
18+
; CHECK-NEXT: [[CMP1:%.*]] = fcmp ord double [[X:%.*]], 0.000000e+00
19+
; CHECK-NEXT: [[CMP2:%.*]] = fcmp ord double [[Y:%.*]], 0.000000e+00
20+
; CHECK-NEXT: [[AND:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 false
21+
; CHECK-NEXT: ret i1 [[AND]]
22+
;
23+
%cmp1 = fcmp ord double %x, 0.0
24+
%cmp2 = fcmp ord double %y, 0.0
25+
%and = select i1 %cmp1, i1 %cmp2, i1 false
26+
ret i1 %and
27+
}
28+
29+
define i1 @PR1738_logical_noundef(double %x, double noundef %y) {
30+
; CHECK-LABEL: @PR1738_logical_noundef(
1731
; CHECK-NEXT: [[TMP1:%.*]] = fcmp ord double [[X:%.*]], [[Y:%.*]]
1832
; CHECK-NEXT: ret i1 [[TMP1]]
1933
;
@@ -47,10 +61,13 @@ define i1 @PR41069(i1 %z, float %c, float %d) {
4761
ret i1 %r
4862
}
4963

64+
; FIXME: this can be supported by freezing %d
5065
define i1 @PR41069_logical(i1 %z, float %c, float %d) {
5166
; CHECK-LABEL: @PR41069_logical(
52-
; CHECK-NEXT: [[TMP1:%.*]] = fcmp ord float [[D:%.*]], [[C:%.*]]
53-
; CHECK-NEXT: [[R:%.*]] = and i1 [[TMP1]], [[Z:%.*]]
67+
; CHECK-NEXT: [[ORD1:%.*]] = fcmp arcp ord float [[C:%.*]], 0.000000e+00
68+
; CHECK-NEXT: [[AND:%.*]] = select i1 [[ORD1]], i1 [[Z:%.*]], i1 false
69+
; CHECK-NEXT: [[ORD2:%.*]] = fcmp afn ord float [[D:%.*]], 0.000000e+00
70+
; CHECK-NEXT: [[R:%.*]] = select i1 [[AND]], i1 [[ORD2]], i1 false
5471
; CHECK-NEXT: ret i1 [[R]]
5572
;
5673
%ord1 = fcmp arcp ord float %c, 0.0
@@ -77,9 +94,9 @@ define i1 @PR41069_commute(i1 %z, float %c, float %d) {
7794
define i1 @PR41069_commute_logical(i1 %z, float %c, float %d) {
7895
; CHECK-LABEL: @PR41069_commute_logical(
7996
; CHECK-NEXT: [[ORD1:%.*]] = fcmp ninf ord float [[C:%.*]], 0.000000e+00
80-
; CHECK-NEXT: [[AND:%.*]] = and i1 [[ORD1]], [[Z:%.*]]
8197
; CHECK-NEXT: [[ORD2:%.*]] = fcmp reassoc ninf ord float [[D:%.*]], 0.000000e+00
82-
; CHECK-NEXT: [[R:%.*]] = select i1 [[ORD2]], i1 [[AND]], i1 false
98+
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[ORD2]], i1 [[ORD1]], i1 false
99+
; CHECK-NEXT: [[R:%.*]] = select i1 [[TMP1]], i1 [[Z:%.*]], i1 false
83100
; CHECK-NEXT: ret i1 [[R]]
84101
;
85102
%ord1 = fcmp ninf ord float %c, 0.0
@@ -138,7 +155,7 @@ define i1 @PR15737_logical(float %a, double %b) {
138155
; CHECK-LABEL: @PR15737_logical(
139156
; CHECK-NEXT: [[CMP:%.*]] = fcmp ord float [[A:%.*]], 0.000000e+00
140157
; CHECK-NEXT: [[CMP1:%.*]] = fcmp ord double [[B:%.*]], 0.000000e+00
141-
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP]], [[CMP1]]
158+
; CHECK-NEXT: [[AND:%.*]] = select i1 [[CMP]], i1 [[CMP1]], i1 false
142159
; CHECK-NEXT: ret i1 [[AND]]
143160
;
144161
%cmp = fcmp ord float %a, 0.000000e+00
@@ -171,10 +188,13 @@ define i1 @fcmp_ord_nonzero(float %x, float %y) {
171188
ret i1 %and
172189
}
173190

191+
; TODO: this can be supported by freezing %y
174192
define i1 @fcmp_ord_nonzero_logical(float %x, float %y) {
175193
; CHECK-LABEL: @fcmp_ord_nonzero_logical(
176-
; CHECK-NEXT: [[TMP1:%.*]] = fcmp ord float [[X:%.*]], [[Y:%.*]]
177-
; CHECK-NEXT: ret i1 [[TMP1]]
194+
; CHECK-NEXT: [[CMP1:%.*]] = fcmp ord float [[X:%.*]], 0.000000e+00
195+
; CHECK-NEXT: [[CMP2:%.*]] = fcmp ord float [[Y:%.*]], 0.000000e+00
196+
; CHECK-NEXT: [[AND:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 false
197+
; CHECK-NEXT: ret i1 [[AND]]
178198
;
179199
%cmp1 = fcmp ord float %x, 1.0
180200
%cmp2 = fcmp ord float %y, 2.0

llvm/test/Transforms/InstCombine/and-or-icmp-min-max.ll

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,7 +1067,9 @@ define i1 @sge_or_max_commute(i8 %x, i8 %y) {
10671067
define i1 @sge_or_max_commute_logical(i8 %x, i8 %y) {
10681068
; CHECK-LABEL: @sge_or_max_commute_logical(
10691069
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[X:%.*]], [[Y:%.*]]
1070-
; CHECK-NEXT: ret i1 [[CMP]]
1070+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127
1071+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]
1072+
; CHECK-NEXT: ret i1 [[R]]
10711073
;
10721074
%cmp = icmp sge i8 %x, %y
10731075
%cmpeq = icmp eq i8 %x, 127
@@ -1111,7 +1113,9 @@ define i1 @sge_swap_or_max_commute(i8 %x, i8 %y) {
11111113
define i1 @sge_swap_or_max_commute_logical(i8 %x, i8 %y) {
11121114
; CHECK-LABEL: @sge_swap_or_max_commute_logical(
11131115
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[Y:%.*]], [[X:%.*]]
1114-
; CHECK-NEXT: ret i1 [[CMP]]
1116+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 127
1117+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]
1118+
; CHECK-NEXT: ret i1 [[R]]
11151119
;
11161120
%cmp = icmp sle i8 %y, %x
11171121
%cmpeq = icmp eq i8 %x, 127
@@ -1155,7 +1159,9 @@ define i1 @uge_or_max_commute(i8 %x, i8 %y) {
11551159
define i1 @uge_or_max_commute_logical(i8 %x, i8 %y) {
11561160
; CHECK-LABEL: @uge_or_max_commute_logical(
11571161
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[X:%.*]], [[Y:%.*]]
1158-
; CHECK-NEXT: ret i1 [[CMP]]
1162+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1
1163+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]
1164+
; CHECK-NEXT: ret i1 [[R]]
11591165
;
11601166
%cmp = icmp uge i8 %x, %y
11611167
%cmpeq = icmp eq i8 %x, 255
@@ -1199,7 +1205,9 @@ define i1 @uge_swap_or_max_commute(i8 %x, i8 %y) {
11991205
define i1 @uge_swap_or_max_commute_logical(i8 %x, i8 %y) {
12001206
; CHECK-LABEL: @uge_swap_or_max_commute_logical(
12011207
; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[Y:%.*]], [[X:%.*]]
1202-
; CHECK-NEXT: ret i1 [[CMP]]
1208+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -1
1209+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]
1210+
; CHECK-NEXT: ret i1 [[R]]
12031211
;
12041212
%cmp = icmp ule i8 %y, %x
12051213
%cmpeq = icmp eq i8 %x, 255
@@ -1249,7 +1257,9 @@ define i1 @sle_or_min_commute(i8 %x, i8 %y) {
12491257
define i1 @sle_or_min_commute_logical(i8 %x, i8 %y) {
12501258
; CHECK-LABEL: @sle_or_min_commute_logical(
12511259
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i8 [[X:%.*]], [[Y:%.*]]
1252-
; CHECK-NEXT: ret i1 [[CMP]]
1260+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128
1261+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]
1262+
; CHECK-NEXT: ret i1 [[R]]
12531263
;
12541264
%cmp = icmp sle i8 %x, %y
12551265
%cmpeq = icmp eq i8 %x, 128
@@ -1293,7 +1303,9 @@ define i1 @sle_swap_or_min_commute(i8 %x, i8 %y) {
12931303
define i1 @sle_swap_or_min_commute_logical(i8 %x, i8 %y) {
12941304
; CHECK-LABEL: @sle_swap_or_min_commute_logical(
12951305
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[Y:%.*]], [[X:%.*]]
1296-
; CHECK-NEXT: ret i1 [[CMP]]
1306+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], -128
1307+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]
1308+
; CHECK-NEXT: ret i1 [[R]]
12971309
;
12981310
%cmp = icmp sge i8 %y, %x
12991311
%cmpeq = icmp eq i8 %x, 128
@@ -1337,7 +1349,9 @@ define i1 @ule_or_min_commute(i8 %x, i8 %y) {
13371349
define i1 @ule_or_min_commute_logical(i8 %x, i8 %y) {
13381350
; CHECK-LABEL: @ule_or_min_commute_logical(
13391351
; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[X:%.*]], [[Y:%.*]]
1340-
; CHECK-NEXT: ret i1 [[CMP]]
1352+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0
1353+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]
1354+
; CHECK-NEXT: ret i1 [[R]]
13411355
;
13421356
%cmp = icmp ule i8 %x, %y
13431357
%cmpeq = icmp eq i8 %x, 0
@@ -1381,7 +1395,9 @@ define i1 @ule_swap_or_min_commute(i8 %x, i8 %y) {
13811395
define i1 @ule_swap_or_min_commute_logical(i8 %x, i8 %y) {
13821396
; CHECK-LABEL: @ule_swap_or_min_commute_logical(
13831397
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[Y:%.*]], [[X:%.*]]
1384-
; CHECK-NEXT: ret i1 [[CMP]]
1398+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8 [[X]], 0
1399+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]
1400+
; CHECK-NEXT: ret i1 [[R]]
13851401
;
13861402
%cmp = icmp uge i8 %y, %x
13871403
%cmpeq = icmp eq i8 %x, 0
@@ -1431,7 +1447,9 @@ define i1 @slt_and_not_max_commute(i8 %x, i8 %y) {
14311447
define i1 @slt_and_not_max_commute_logical(i8 %x, i8 %y) {
14321448
; CHECK-LABEL: @slt_and_not_max_commute_logical(
14331449
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], [[Y:%.*]]
1434-
; CHECK-NEXT: ret i1 [[CMP]]
1450+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127
1451+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
1452+
; CHECK-NEXT: ret i1 [[R]]
14351453
;
14361454
%cmp = icmp slt i8 %x, %y
14371455
%cmpeq = icmp ne i8 %x, 127
@@ -1475,7 +1493,9 @@ define i1 @slt_swap_and_not_max_commute(i8 %x, i8 %y) {
14751493
define i1 @slt_swap_and_not_max_commute_logical(i8 %x, i8 %y) {
14761494
; CHECK-LABEL: @slt_swap_and_not_max_commute_logical(
14771495
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[Y:%.*]], [[X:%.*]]
1478-
; CHECK-NEXT: ret i1 [[CMP]]
1496+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 127
1497+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
1498+
; CHECK-NEXT: ret i1 [[R]]
14791499
;
14801500
%cmp = icmp sgt i8 %y, %x
14811501
%cmpeq = icmp ne i8 %x, 127
@@ -1519,7 +1539,9 @@ define i1 @ult_and_not_max_commute(i8 %x, i8 %y) {
15191539
define i1 @ult_and_not_max_commute_logical(i8 %x, i8 %y) {
15201540
; CHECK-LABEL: @ult_and_not_max_commute_logical(
15211541
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], [[Y:%.*]]
1522-
; CHECK-NEXT: ret i1 [[CMP]]
1542+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1
1543+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
1544+
; CHECK-NEXT: ret i1 [[R]]
15231545
;
15241546
%cmp = icmp ult i8 %x, %y
15251547
%cmpeq = icmp ne i8 %x, 255
@@ -1563,7 +1585,9 @@ define i1 @ult_swap_and_not_max_commute(i8 %x, i8 %y) {
15631585
define i1 @ult_swap_and_not_max_commute_logical(i8 %x, i8 %y) {
15641586
; CHECK-LABEL: @ult_swap_and_not_max_commute_logical(
15651587
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[Y:%.*]], [[X:%.*]]
1566-
; CHECK-NEXT: ret i1 [[CMP]]
1588+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -1
1589+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
1590+
; CHECK-NEXT: ret i1 [[R]]
15671591
;
15681592
%cmp = icmp ugt i8 %y, %x
15691593
%cmpeq = icmp ne i8 %x, 255
@@ -1613,7 +1637,9 @@ define i1 @sgt_and_not_min_commute(i8 %x, i8 %y) {
16131637
define i1 @sgt_and_not_min_commute_logical(i8 %x, i8 %y) {
16141638
; CHECK-LABEL: @sgt_and_not_min_commute_logical(
16151639
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], [[Y:%.*]]
1616-
; CHECK-NEXT: ret i1 [[CMP]]
1640+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128
1641+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
1642+
; CHECK-NEXT: ret i1 [[R]]
16171643
;
16181644
%cmp = icmp sgt i8 %x, %y
16191645
%cmpeq = icmp ne i8 %x, 128
@@ -1657,7 +1683,9 @@ define i1 @sgt_swap_and_not_min_commute(i8 %x, i8 %y) {
16571683
define i1 @sgt_swap_and_not_min_commute_logical(i8 %x, i8 %y) {
16581684
; CHECK-LABEL: @sgt_swap_and_not_min_commute_logical(
16591685
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[Y:%.*]], [[X:%.*]]
1660-
; CHECK-NEXT: ret i1 [[CMP]]
1686+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], -128
1687+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
1688+
; CHECK-NEXT: ret i1 [[R]]
16611689
;
16621690
%cmp = icmp slt i8 %y, %x
16631691
%cmpeq = icmp ne i8 %x, 128
@@ -1701,7 +1729,9 @@ define i1 @ugt_and_not_min_commute(i8 %x, i8 %y) {
17011729
define i1 @ugt_and_not_min_commute_logical(i8 %x, i8 %y) {
17021730
; CHECK-LABEL: @ugt_and_not_min_commute_logical(
17031731
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], [[Y:%.*]]
1704-
; CHECK-NEXT: ret i1 [[CMP]]
1732+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 0
1733+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
1734+
; CHECK-NEXT: ret i1 [[R]]
17051735
;
17061736
%cmp = icmp ugt i8 %x, %y
17071737
%cmpeq = icmp ne i8 %x, 0
@@ -1745,7 +1775,9 @@ define i1 @ugt_swap_and_not_min_commute(i8 %x, i8 %y) {
17451775
define i1 @ugt_swap_and_not_min_commute_logical(i8 %x, i8 %y) {
17461776
; CHECK-LABEL: @ugt_swap_and_not_min_commute_logical(
17471777
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y:%.*]], [[X:%.*]]
1748-
; CHECK-NEXT: ret i1 [[CMP]]
1778+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8 [[X]], 0
1779+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
1780+
; CHECK-NEXT: ret i1 [[R]]
17491781
;
17501782
%cmp = icmp ult i8 %y, %x
17511783
%cmpeq = icmp ne i8 %x, 0

llvm/test/Transforms/InstCombine/and-or-icmp-nullptr.ll

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,9 @@ define i1 @ule_or_min_commute(i8* %x, i8* %y) {
318318
define i1 @ule_or_min_commute_logical(i8* %x, i8* %y) {
319319
; CHECK-LABEL: @ule_or_min_commute_logical(
320320
; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8* [[X:%.*]], [[Y:%.*]]
321-
; CHECK-NEXT: ret i1 [[CMP]]
321+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8* [[X]], null
322+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]
323+
; CHECK-NEXT: ret i1 [[R]]
322324
;
323325
%cmp = icmp ule i8* %x, %y
324326
%cmpeq = icmp eq i8* %x, null
@@ -362,7 +364,9 @@ define i1 @ule_swap_or_min_commute(i8* %x, i8* %y) {
362364
define i1 @ule_swap_or_min_commute_logical(i8* %x, i8* %y) {
363365
; CHECK-LABEL: @ule_swap_or_min_commute_logical(
364366
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8* [[Y:%.*]], [[X:%.*]]
365-
; CHECK-NEXT: ret i1 [[CMP]]
367+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8* [[X]], null
368+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 true, i1 [[CMP]]
369+
; CHECK-NEXT: ret i1 [[R]]
366370
;
367371
%cmp = icmp uge i8* %y, %x
368372
%cmpeq = icmp eq i8* %x, null
@@ -412,7 +416,9 @@ define i1 @ugt_and_not_min_commute(i8* %x, i8* %y) {
412416
define i1 @ugt_and_not_min_commute_logical(i8* %x, i8* %y) {
413417
; CHECK-LABEL: @ugt_and_not_min_commute_logical(
414418
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8* [[X:%.*]], [[Y:%.*]]
415-
; CHECK-NEXT: ret i1 [[CMP]]
419+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8* [[X]], null
420+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
421+
; CHECK-NEXT: ret i1 [[R]]
416422
;
417423
%cmp = icmp ugt i8* %x, %y
418424
%cmpeq = icmp ne i8* %x, null
@@ -456,7 +462,9 @@ define i1 @ugt_swap_and_not_min_commute(i8* %x, i8* %y) {
456462
define i1 @ugt_swap_and_not_min_commute_logical(i8* %x, i8* %y) {
457463
; CHECK-LABEL: @ugt_swap_and_not_min_commute_logical(
458464
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8* [[Y:%.*]], [[X:%.*]]
459-
; CHECK-NEXT: ret i1 [[CMP]]
465+
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp ne i8* [[X]], null
466+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
467+
; CHECK-NEXT: ret i1 [[R]]
460468
;
461469
%cmp = icmp ult i8* %y, %x
462470
%cmpeq = icmp ne i8* %x, null
@@ -704,9 +712,9 @@ define i1 @slt_and_min(i8* %a, i8* %b) {
704712
define i1 @slt_and_min_logical(i8* %a, i8* %b) {
705713
; CHECK-LABEL: @slt_and_min_logical(
706714
; CHECK-NEXT: [[CMPEQ:%.*]] = icmp eq i8* [[A:%.*]], null
707-
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i8* [[B:%.*]], null
708-
; CHECK-NEXT: [[TMP2:%.*]] = and i1 [[CMPEQ]], [[TMP1]]
709-
; CHECK-NEXT: ret i1 [[TMP2]]
715+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8* [[B:%.*]], null
716+
; CHECK-NEXT: [[R:%.*]] = select i1 [[CMPEQ]], i1 [[CMP]], i1 false
717+
; CHECK-NEXT: ret i1 [[R]]
710718
;
711719
%cmpeq = icmp eq i8* %a, null
712720
%cmp = icmp slt i8* %a, %b

0 commit comments

Comments
 (0)