Skip to content

Commit 6aabb10

Browse files
committed
[SCCP] Use ranges for predicate info conditions.
This patch updates the code that deals with conditions from predicate info to make use of constant ranges. For ssa_copy instructions inserted by PredicateInfo, we have 2 ranges: 1. The range of the original value. 2. The range imposed by the linked condition. 1. is known, 2. can be determined using makeAllowedICmpRegion. The intersection of those ranges is the range for the copy. With this patch, we get a nice increase in the number of instructions eliminated by both SCCP and IPSCCP for some benchmarks: For MultiSource, SPEC2000 & SPEC2006: Tests: 237 Same hash: 170 (filtered out) Remaining: 67 Metric: sccp.NumInstRemoved Program base patch diff test-suite...Source/Benchmarks/sim/sim.test 10.00 71.00 610.0% test-suite...CFP2000/177.mesa/177.mesa.test 361.00 1626.00 350.4% test-suite...encode/alacconvert-encode.test 141.00 602.00 327.0% test-suite...decode/alacconvert-decode.test 141.00 602.00 327.0% test-suite...CI_Purple/SMG2000/smg2000.test 1639.00 4093.00 149.7% test-suite...peg2/mpeg2dec/mpeg2decode.test 75.00 163.00 117.3% test-suite...T2006/401.bzip2/401.bzip2.test 358.00 513.00 43.3% test-suite...rks/FreeBench/pifft/pifft.test 11.00 15.00 36.4% test-suite...langs-C/unix-tbl/unix-tbl.test 4.00 5.00 25.0% test-suite...lications/sqlite3/sqlite3.test 541.00 667.00 23.3% test-suite.../CINT2000/254.gap/254.gap.test 243.00 299.00 23.0% test-suite...ks/Prolangs-C/agrep/agrep.test 25.00 29.00 16.0% test-suite...marks/7zip/7zip-benchmark.test 1135.00 1304.00 14.9% test-suite...lications/ClamAV/clamscan.test 1105.00 1268.00 14.8% test-suite...urce/Applications/lua/lua.test 398.00 436.00 9.5% Metric: sccp.IPNumInstRemoved Program base patch diff test-suite...C/CFP2000/179.art/179.art.test 1.00 3.00 200.0% test-suite...006/447.dealII/447.dealII.test 429.00 1056.00 146.2% test-suite...nch/fourinarow/fourinarow.test 3.00 7.00 133.3% test-suite...CI_Purple/SMG2000/smg2000.test 818.00 1748.00 113.7% test-suite...ks/McCat/04-bisect/bisect.test 3.00 5.00 66.7% test-suite...CFP2000/177.mesa/177.mesa.test 165.00 255.00 54.5% test-suite...ediabench/gsm/toast/toast.test 18.00 27.00 50.0% test-suite...telecomm-gsm/telecomm-gsm.test 18.00 27.00 50.0% test-suite...ks/Prolangs-C/agrep/agrep.test 24.00 35.00 45.8% test-suite...TimberWolfMC/timberwolfmc.test 43.00 62.00 44.2% test-suite...encode/alacconvert-encode.test 46.00 66.00 43.5% test-suite...decode/alacconvert-decode.test 46.00 66.00 43.5% test-suite...langs-C/unix-tbl/unix-tbl.test 12.00 17.00 41.7% test-suite...peg2/mpeg2dec/mpeg2decode.test 31.00 41.00 32.3% test-suite.../CINT2000/254.gap/254.gap.test 117.00 154.00 31.6% Reviewers: efriedma, davide Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D76611
1 parent 3a4d9f8 commit 6aabb10

File tree

4 files changed

+113
-129
lines changed

4 files changed

+113
-129
lines changed

llvm/lib/Transforms/Scalar/SCCP.cpp

Lines changed: 53 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,24 +1219,19 @@ void SCCPSolver::handleCallResult(CallSite CS) {
12191219

12201220
if (auto *II = dyn_cast<IntrinsicInst>(I)) {
12211221
if (II->getIntrinsicID() == Intrinsic::ssa_copy) {
1222-
if (isOverdefined(ValueState[I]))
1223-
return (void)markOverdefined(I);
1224-
1225-
auto *PI = getPredicateInfoFor(I);
1226-
if (!PI)
1222+
if (ValueState[I].isOverdefined())
12271223
return;
12281224

12291225
Value *CopyOf = I->getOperand(0);
1230-
auto *PBranch = dyn_cast<PredicateBranch>(PI);
1231-
if (!PBranch) {
1226+
auto *PI = getPredicateInfoFor(I);
1227+
auto *PBranch = dyn_cast_or_null<PredicateBranch>(PI);
1228+
if (!PI || !PBranch) {
12321229
mergeInValue(ValueState[I], I, getValueState(CopyOf));
12331230
return;
12341231
}
12351232

1236-
Value *Cond = PBranch->Condition;
1237-
12381233
// Everything below relies on the condition being a comparison.
1239-
auto *Cmp = dyn_cast<CmpInst>(Cond);
1234+
auto *Cmp = dyn_cast<CmpInst>(PBranch->Condition);
12401235
if (!Cmp) {
12411236
mergeInValue(ValueState[I], I, getValueState(CopyOf));
12421237
return;
@@ -1249,26 +1244,60 @@ void SCCPSolver::handleCallResult(CallSite CS) {
12491244
return;
12501245
}
12511246

1252-
if (CmpOp0 != CopyOf)
1247+
auto Pred = Cmp->getPredicate();
1248+
if (CmpOp0 != CopyOf) {
12531249
std::swap(CmpOp0, CmpOp1);
1250+
Pred = Cmp->getSwappedPredicate();
1251+
}
12541252

1255-
ValueLatticeElement OriginalVal = getValueState(CopyOf);
1256-
ValueLatticeElement EqVal = getValueState(CmpOp1);
1257-
ValueLatticeElement &IV = ValueState[I];
1258-
if (PBranch->TrueEdge && Cmp->getPredicate() == CmpInst::ICMP_EQ) {
1253+
// Wait until CmpOp1 is resolved.
1254+
if (getValueState(CmpOp1).isUnknown()) {
12591255
addAdditionalUser(CmpOp1, I);
1260-
if (isConstant(OriginalVal))
1261-
mergeInValue(IV, I, OriginalVal);
1262-
else
1263-
mergeInValue(IV, I, EqVal);
12641256
return;
12651257
}
1266-
if (!PBranch->TrueEdge && Cmp->getPredicate() == CmpInst::ICMP_NE) {
1258+
1259+
if (!PBranch->TrueEdge)
1260+
Pred = CmpInst::getInversePredicate(Pred);
1261+
1262+
ValueLatticeElement CondVal = getValueState(CmpOp1);
1263+
ValueLatticeElement &IV = ValueState[I];
1264+
ValueLatticeElement OriginalVal = getValueState(CopyOf);
1265+
if (CondVal.isConstantRange() || OriginalVal.isConstantRange()) {
1266+
auto NewCR =
1267+
ConstantRange::getFull(DL.getTypeSizeInBits(CopyOf->getType()));
1268+
1269+
// Get the range imposed by the condition.
1270+
if (CondVal.isConstantRange())
1271+
NewCR = ConstantRange::makeAllowedICmpRegion(
1272+
Pred, CondVal.getConstantRange());
1273+
1274+
// Combine range info for the original value with the new range from the
1275+
// condition.
1276+
auto OriginalCR = OriginalVal.isConstantRange()
1277+
? OriginalVal.getConstantRange()
1278+
: ConstantRange::getFull(
1279+
DL.getTypeSizeInBits(CopyOf->getType()));
1280+
NewCR = NewCR.intersectWith(OriginalCR);
1281+
1282+
addAdditionalUser(CmpOp1, I);
1283+
// TODO: Actually filp MayIncludeUndef for the created range to false,
1284+
// once most places in the optimizer respect the branches on
1285+
// undef/poison are UB rule. The reason why the new range cannot be
1286+
// undef is as follows below:
1287+
// The new range is based on a branch condition. That guarantees that
1288+
// neither of the compare operands can be undef in the branch targets,
1289+
// unless we have conditions that are always true/false (e.g. icmp ule
1290+
// i32, %a, i32_max). For the latter overdefined/empty range will be
1291+
// inferred, but the branch will get folded accordingly anyways.
1292+
mergeInValue(
1293+
IV, I,
1294+
ValueLatticeElement::getRange(NewCR, /*MayIncludeUndef=*/true));
1295+
return;
1296+
} else if (Pred == CmpInst::ICMP_EQ && CondVal.isConstant()) {
1297+
// For non-integer values or integer constant expressions, only
1298+
// propagate equal constants.
12671299
addAdditionalUser(CmpOp1, I);
1268-
if (isConstant(OriginalVal))
1269-
mergeInValue(IV, I, OriginalVal);
1270-
else
1271-
mergeInValue(IV, I, EqVal);
1300+
mergeInValue(IV, I, CondVal);
12721301
return;
12731302
}
12741303

llvm/test/Transforms/SCCP/conditions-ranges-with-undef.ll

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ define void @val_undef_range() {
4545
; CHECK-NEXT: [[BC_1:%.*]] = icmp ult i32 [[A]], 127
4646
; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
4747
; CHECK: true:
48-
; CHECK-NEXT: [[F_1:%.*]] = icmp eq i32 [[A]], 128
49-
; CHECK-NEXT: call void @use(i1 [[F_1]])
48+
; CHECK-NEXT: call void @use(i1 false)
5049
; CHECK-NEXT: [[A_127:%.*]] = and i32 [[A]], 127
5150
; CHECK-NEXT: call void @use.i32(i32 [[A_127]])
5251
; CHECK-NEXT: ret void
@@ -83,7 +82,8 @@ define void @val_singlecrfromundef_range(i1 %cond) {
8382
; CHECK-NEXT: br label [[TRUE:%.*]]
8483
; CHECK: true:
8584
; CHECK-NEXT: call void @use(i1 false)
86-
; CHECK-NEXT: call void @use.i32(i32 10)
85+
; CHECK-NEXT: [[P_127:%.*]] = and i32 10, 127
86+
; CHECK-NEXT: call void @use.i32(i32 [[P_127]])
8787
; CHECK-NEXT: ret void
8888
;
8989
entry:
@@ -130,8 +130,7 @@ define void @val_undef_to_cr_to_overdef_range(i32 %a, i1 %cond) {
130130
; CHECK-NEXT: [[BC_1:%.*]] = icmp ult i32 [[P]], 100
131131
; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
132132
; CHECK: true:
133-
; CHECK-NEXT: [[F_1:%.*]] = icmp eq i32 [[P]], 128
134-
; CHECK-NEXT: call void @use(i1 [[F_1]])
133+
; CHECK-NEXT: call void @use(i1 false)
135134
; CHECK-NEXT: [[P_127:%.*]] = and i32 [[P]], 127
136135
; CHECK-NEXT: call void @use.i32(i32 [[P_127]])
137136
; CHECK-NEXT: ret void
@@ -179,10 +178,8 @@ define void @bound_singlecrfromundef(i32 %a, i1 %cond) {
179178
; CHECK-NEXT: [[BC_1:%.*]] = icmp ugt i32 [[A:%.*]], 10
180179
; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
181180
; CHECK: true:
182-
; CHECK-NEXT: [[F_1:%.*]] = icmp eq i32 [[A]], 5
183-
; CHECK-NEXT: call void @use(i1 [[F_1]])
184-
; CHECK-NEXT: [[T_1:%.*]] = icmp ne i32 [[A]], 5
185-
; CHECK-NEXT: call void @use(i1 [[T_1]])
181+
; CHECK-NEXT: call void @use(i1 false)
182+
; CHECK-NEXT: call void @use(i1 true)
186183
; CHECK-NEXT: [[A_127:%.*]] = and i32 [[A]], 127
187184
; CHECK-NEXT: call void @use.i32(i32 [[A_127]])
188185
; CHECK-NEXT: ret void

llvm/test/Transforms/SCCP/conditions-ranges.ll

Lines changed: 47 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,11 @@ define void @f1(i32 %a, i32 %b) {
1111
; CHECK-NEXT: [[BC:%.*]] = icmp ugt i32 [[B:%.*]], [[A_2]]
1212
; CHECK-NEXT: br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]
1313
; CHECK: true:
14-
; CHECK-NEXT: [[F_1:%.*]] = icmp eq i32 [[B]], 0
15-
; CHECK-NEXT: call void @use(i1 [[F_1]])
16-
; CHECK-NEXT: [[F_2:%.*]] = icmp eq i32 [[B]], 20
17-
; CHECK-NEXT: call void @use(i1 [[F_2]])
18-
; CHECK-NEXT: [[F_3:%.*]] = icmp ult i32 [[B]], 20
19-
; CHECK-NEXT: call void @use(i1 [[F_3]])
20-
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i32 [[B]], 5
21-
; CHECK-NEXT: call void @use(i1 [[T_1]])
22-
; CHECK-NEXT: [[T_2:%.*]] = icmp ne i32 [[B]], 20
23-
; CHECK-NEXT: call void @use(i1 [[T_2]])
14+
; CHECK-NEXT: call void @use(i1 false)
15+
; CHECK-NEXT: call void @use(i1 false)
16+
; CHECK-NEXT: call void @use(i1 false)
17+
; CHECK-NEXT: call void @use(i1 true)
18+
; CHECK-NEXT: call void @use(i1 true)
2419
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[B]], 21
2520
; CHECK-NEXT: call void @use(i1 [[C_1]])
2621
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[B]], 21
@@ -29,14 +24,10 @@ define void @f1(i32 %a, i32 %b) {
2924
; CHECK-NEXT: call void @use(i1 [[C_3]])
3025
; CHECK-NEXT: ret void
3126
; CHECK: false:
32-
; CHECK-NEXT: [[F_4:%.*]] = icmp eq i32 [[B]], 276
33-
; CHECK-NEXT: call void @use(i1 [[F_4]])
34-
; CHECK-NEXT: [[F_5:%.*]] = icmp ugt i32 [[B]], 275
35-
; CHECK-NEXT: call void @use(i1 [[F_5]])
36-
; CHECK-NEXT: [[T_3:%.*]] = icmp ne i32 [[B]], 276
37-
; CHECK-NEXT: call void @use(i1 [[T_3]])
38-
; CHECK-NEXT: [[T_4:%.*]] = icmp ule i32 [[B]], 275
39-
; CHECK-NEXT: call void @use(i1 [[T_4]])
27+
; CHECK-NEXT: call void @use(i1 false)
28+
; CHECK-NEXT: call void @use(i1 false)
29+
; CHECK-NEXT: call void @use(i1 true)
30+
; CHECK-NEXT: call void @use(i1 true)
4031
; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 [[B]], 21
4132
; CHECK-NEXT: call void @use(i1 [[C_4]])
4233
; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[B]], 275
@@ -279,24 +270,15 @@ define void @f8_nested_conds(i32 %a, i32 %b) {
279270
; CHECK-NEXT: [[BC_2:%.*]] = icmp ult i32 [[B]], 255
280271
; CHECK-NEXT: br i1 [[BC_2]], label [[TRUE_2:%.*]], label [[FALSE_2:%.*]]
281272
; CHECK: true.2:
282-
; CHECK-NEXT: [[F_1:%.*]] = icmp eq i32 [[B]], 0
283-
; CHECK-NEXT: call void @use(i1 [[F_1]])
284-
; CHECK-NEXT: [[F_2:%.*]] = icmp eq i32 [[B]], 20
285-
; CHECK-NEXT: call void @use(i1 [[F_2]])
286-
; CHECK-NEXT: [[F_3:%.*]] = icmp ult i32 [[B]], 20
287-
; CHECK-NEXT: call void @use(i1 [[F_3]])
288-
; CHECK-NEXT: [[F_4:%.*]] = icmp eq i32 [[B]], 255
289-
; CHECK-NEXT: call void @use(i1 [[F_4]])
290-
; CHECK-NEXT: [[F_5:%.*]] = icmp ugt i32 [[B]], 255
291-
; CHECK-NEXT: call void @use(i1 [[F_5]])
292-
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i32 [[B]], 5
293-
; CHECK-NEXT: call void @use(i1 [[T_1]])
294-
; CHECK-NEXT: [[T_2:%.*]] = icmp ne i32 [[B]], 20
295-
; CHECK-NEXT: call void @use(i1 [[T_2]])
296-
; CHECK-NEXT: [[T_3:%.*]] = icmp ult i32 [[B]], 255
297-
; CHECK-NEXT: call void @use(i1 [[T_3]])
298-
; CHECK-NEXT: [[T_4:%.*]] = icmp ne i32 [[B]], 300
299-
; CHECK-NEXT: call void @use(i1 [[T_4]])
273+
; CHECK-NEXT: call void @use(i1 false)
274+
; CHECK-NEXT: call void @use(i1 false)
275+
; CHECK-NEXT: call void @use(i1 false)
276+
; CHECK-NEXT: call void @use(i1 false)
277+
; CHECK-NEXT: call void @use(i1 false)
278+
; CHECK-NEXT: call void @use(i1 true)
279+
; CHECK-NEXT: call void @use(i1 true)
280+
; CHECK-NEXT: call void @use(i1 true)
281+
; CHECK-NEXT: call void @use(i1 true)
300282
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[B]], 21
301283
; CHECK-NEXT: call void @use(i1 [[C_1]])
302284
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[B]], 21
@@ -305,14 +287,10 @@ define void @f8_nested_conds(i32 %a, i32 %b) {
305287
; CHECK-NEXT: call void @use(i1 [[C_3]])
306288
; CHECK-NEXT: ret void
307289
; CHECK: false.2:
308-
; CHECK-NEXT: [[F_6:%.*]] = icmp eq i32 [[B]], 254
309-
; CHECK-NEXT: call void @use(i1 [[F_6]])
310-
; CHECK-NEXT: [[F_7:%.*]] = icmp ult i32 [[B]], 255
311-
; CHECK-NEXT: call void @use(i1 [[F_7]])
312-
; CHECK-NEXT: [[T_5:%.*]] = icmp ne i32 [[B]], 254
313-
; CHECK-NEXT: call void @use(i1 [[T_5]])
314-
; CHECK-NEXT: [[T_6:%.*]] = icmp uge i32 [[B]], 255
315-
; CHECK-NEXT: call void @use(i1 [[T_6]])
290+
; CHECK-NEXT: call void @use(i1 false)
291+
; CHECK-NEXT: call void @use(i1 false)
292+
; CHECK-NEXT: call void @use(i1 true)
293+
; CHECK-NEXT: call void @use(i1 true)
316294
; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 [[B]], 255
317295
; CHECK-NEXT: call void @use(i1 [[C_4]])
318296
; CHECK-NEXT: [[C_5:%.*]] = icmp ne i32 [[B]], 275
@@ -395,29 +373,21 @@ define void @f9_nested_conds(i32 %a, i32 %b) {
395373
; CHECK-NEXT: [[BC_1:%.*]] = icmp ugt i32 [[B:%.*]], 10
396374
; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
397375
; CHECK: true:
398-
; CHECK-NEXT: [[F_1:%.*]] = icmp eq i32 [[B]], 0
399-
; CHECK-NEXT: call void @use(i1 [[F_1]])
400-
; CHECK-NEXT: [[F_2:%.*]] = icmp eq i32 [[B]], 10
401-
; CHECK-NEXT: call void @use(i1 [[F_2]])
402-
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i32 [[B]], 5
403-
; CHECK-NEXT: call void @use(i1 [[T_1]])
404-
; CHECK-NEXT: [[T_2:%.*]] = icmp ne i32 [[B]], 10
405-
; CHECK-NEXT: call void @use(i1 [[T_2]])
376+
; CHECK-NEXT: call void @use(i1 false)
377+
; CHECK-NEXT: call void @use(i1 false)
378+
; CHECK-NEXT: call void @use(i1 true)
379+
; CHECK-NEXT: call void @use(i1 true)
406380
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[B]], 11
407381
; CHECK-NEXT: call void @use(i1 [[C_1]])
408382
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[B]], 11
409383
; CHECK-NEXT: call void @use(i1 [[C_2]])
410384
; CHECK-NEXT: [[BC_2:%.*]] = icmp ugt i32 [[B]], 20
411385
; CHECK-NEXT: br i1 [[BC_2]], label [[TRUE_2:%.*]], label [[FALSE_2:%.*]]
412386
; CHECK: true.2:
413-
; CHECK-NEXT: [[F_3:%.*]] = icmp eq i32 [[B]], 11
414-
; CHECK-NEXT: call void @use(i1 [[F_3]])
415-
; CHECK-NEXT: [[F_4:%.*]] = icmp eq i32 [[B]], 20
416-
; CHECK-NEXT: call void @use(i1 [[F_4]])
417-
; CHECK-NEXT: [[T_3:%.*]] = icmp ugt i32 [[B]], 11
418-
; CHECK-NEXT: call void @use(i1 [[T_3]])
419-
; CHECK-NEXT: [[T_4:%.*]] = icmp ne i32 [[B]], 20
420-
; CHECK-NEXT: call void @use(i1 [[T_4]])
387+
; CHECK-NEXT: call void @use(i1 false)
388+
; CHECK-NEXT: call void @use(i1 false)
389+
; CHECK-NEXT: call void @use(i1 true)
390+
; CHECK-NEXT: call void @use(i1 true)
421391
; CHECK-NEXT: [[C_3:%.*]] = icmp eq i32 [[B]], 21
422392
; CHECK-NEXT: call void @use(i1 [[C_3]])
423393
; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[B]], 21
@@ -426,18 +396,12 @@ define void @f9_nested_conds(i32 %a, i32 %b) {
426396
; CHECK-NEXT: call void @use(i1 [[C_5]])
427397
; CHECK-NEXT: ret void
428398
; CHECK: false.2:
429-
; CHECK-NEXT: [[F_5:%.*]] = icmp eq i32 [[B]], 21
430-
; CHECK-NEXT: call void @use(i1 [[F_5]])
431-
; CHECK-NEXT: [[F_6:%.*]] = icmp ugt i32 [[B]], 21
432-
; CHECK-NEXT: call void @use(i1 [[F_6]])
433-
; CHECK-NEXT: [[F_7:%.*]] = icmp ne i32 [[B]], 5
434-
; CHECK-NEXT: call void @use(i1 [[F_7]])
435-
; CHECK-NEXT: [[T_5:%.*]] = icmp ne i32 [[B]], 21
436-
; CHECK-NEXT: call void @use(i1 [[T_5]])
437-
; CHECK-NEXT: [[T_6:%.*]] = icmp ult i32 [[B]], 21
438-
; CHECK-NEXT: call void @use(i1 [[T_6]])
439-
; CHECK-NEXT: [[T_7:%.*]] = icmp ne i32 [[B]], 5
440-
; CHECK-NEXT: call void @use(i1 [[T_7]])
399+
; CHECK-NEXT: call void @use(i1 false)
400+
; CHECK-NEXT: call void @use(i1 false)
401+
; CHECK-NEXT: call void @use(i1 true)
402+
; CHECK-NEXT: call void @use(i1 true)
403+
; CHECK-NEXT: call void @use(i1 true)
404+
; CHECK-NEXT: call void @use(i1 true)
441405
; CHECK-NEXT: [[C_6:%.*]] = icmp eq i32 [[B]], 11
442406
; CHECK-NEXT: call void @use(i1 [[C_6]])
443407
; CHECK-NEXT: [[C_7:%.*]] = icmp ne i32 [[B]], 15
@@ -530,18 +494,12 @@ define void @f10_cond_does_not_restrict_range(i32 %a, i32 %b) {
530494
; CHECK-NEXT: [[B_255:%.*]] = and i32 [[B:%.*]], 255
531495
; CHECK-NEXT: br label [[TRUE:%.*]]
532496
; CHECK: true:
533-
; CHECK-NEXT: [[F_1:%.*]] = icmp eq i32 [[B_255]], 256
534-
; CHECK-NEXT: call void @use(i1 [[F_1]])
535-
; CHECK-NEXT: [[F_2:%.*]] = icmp eq i32 [[B_255]], 300
536-
; CHECK-NEXT: call void @use(i1 [[F_2]])
537-
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i32 [[B_255]], 256
538-
; CHECK-NEXT: call void @use(i1 [[T_1]])
539-
; CHECK-NEXT: [[T_2:%.*]] = icmp ult i32 [[B_255]], 300
540-
; CHECK-NEXT: call void @use(i1 [[T_2]])
541-
; CHECK-NEXT: [[T_3:%.*]] = icmp ne i32 [[B_255]], 256
542-
; CHECK-NEXT: call void @use(i1 [[T_3]])
543-
; CHECK-NEXT: [[T_4:%.*]] = icmp ne i32 [[B_255]], 300
544-
; CHECK-NEXT: call void @use(i1 [[T_4]])
497+
; CHECK-NEXT: call void @use(i1 false)
498+
; CHECK-NEXT: call void @use(i1 false)
499+
; CHECK-NEXT: call void @use(i1 true)
500+
; CHECK-NEXT: call void @use(i1 true)
501+
; CHECK-NEXT: call void @use(i1 true)
502+
; CHECK-NEXT: call void @use(i1 true)
545503
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[B_255]], 11
546504
; CHECK-NEXT: call void @use(i1 [[C_1]])
547505
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[B_255]], 30
@@ -649,10 +607,8 @@ define void @f13_constexpr1() {
649607
; CHECK-NEXT: [[BC_1:%.*]] = icmp eq i32 add (i32 ptrtoint (i32* @A to i32), i32 10), 55
650608
; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
651609
; CHECK: true:
652-
; CHECK-NEXT: [[F_1:%.*]] = icmp eq i32 add (i32 ptrtoint (i32* @A to i32), i32 10), 10
653-
; CHECK-NEXT: call void @use(i1 [[F_1]])
654-
; CHECK-NEXT: [[F_2:%.*]] = icmp eq i32 add (i32 ptrtoint (i32* @A to i32), i32 10), 55
655-
; CHECK-NEXT: call void @use(i1 [[F_2]])
610+
; CHECK-NEXT: call void @use(i1 false)
611+
; CHECK-NEXT: call void @use(i1 true)
656612
; CHECK-NEXT: ret void
657613
; CHECK: false:
658614
; CHECK-NEXT: ret void
@@ -680,8 +636,8 @@ define void @f14_constexpr2() {
680636
; CHECK-NEXT: entry:
681637
; CHECK-NEXT: br i1 icmp eq (i32 ptrtoint (i32* @A to i32), i32 ptrtoint (i32* @B to i32)), label [[TRUE:%.*]], label [[FALSE:%.*]]
682638
; CHECK: true:
683-
; CHECK-NEXT: call void @use(i1 icmp ne (i32 ptrtoint (i32* @A to i32), i32 ptrtoint (i32* @B to i32)))
684-
; CHECK-NEXT: call void @use(i1 icmp eq (i32 ptrtoint (i32* @A to i32), i32 ptrtoint (i32* @B to i32)))
639+
; CHECK-NEXT: call void @use(i1 icmp ne (i32 ptrtoint (i32* @B to i32), i32 ptrtoint (i32* @A to i32)))
640+
; CHECK-NEXT: call void @use(i1 icmp eq (i32 ptrtoint (i32* @B to i32), i32 ptrtoint (i32* @A to i32)))
685641
; CHECK-NEXT: ret void
686642
; CHECK: false:
687643
; CHECK-NEXT: ret void
@@ -830,10 +786,9 @@ define i32 @udiv_2(i64 %sz) {
830786
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[SZ:%.*]], 4088
831787
; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
832788
; CHECK: cond.true:
833-
; CHECK-NEXT: [[DIV:%.*]] = udiv i64 4088, [[SZ]]
834789
; CHECK-NEXT: br label [[COND_END]]
835790
; CHECK: cond.end:
836-
; CHECK-NEXT: [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]
791+
; CHECK-NEXT: [[COND:%.*]] = phi i64 [ 0, [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]
837792
; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[COND]] to i32
838793
; CHECK-NEXT: ret i32 [[CONV]]
839794
;

llvm/test/Transforms/SCCP/ip-constant-ranges.ll

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,21 @@ end:
8484
}
8585

8686
; CHECK-LABEL: f4
87-
; CHECK: %cmp = icmp sgt i32 %x, 300
88-
; CHECK: %res = select i1 %cmp, i32 1, i32 2
89-
; CHECK: ret i32 %res
87+
; CHECK: ret i32 undef
9088
define internal i32 @f4(i32 %x) {
9189
entry:
9290
%cmp = icmp sgt i32 %x, 300
9391
%res = select i1 %cmp, i32 1, i32 2
9492
ret i32 %res
9593
}
9694

97-
; ICmp could introduce bounds on ConstantRanges.
95+
; ICmp introduces bounds on ConstantRanges.
9896
define i32 @caller3(i32 %x) {
97+
; CHECK-LABEL: define i32 @caller3(i32 %x)
98+
; CHECK-LABEL: end:
99+
; CHECK-NEXT: %res = phi i32 [ 0, %entry ], [ 1, %if.true ]
100+
; CHECK-NEXT: ret i32 %res
101+
;
99102
entry:
100103
%cmp = icmp sgt i32 %x, 300
101104
br i1 %cmp, label %if.true, label %end

0 commit comments

Comments
 (0)