Skip to content

Commit b7db403

Browse files
authored
[CVP] Add samesign flag to icmp (llvm#115642)
Closes llvm#114820.
1 parent eddb79d commit b7db403

File tree

16 files changed

+93
-82
lines changed

16 files changed

+93
-82
lines changed

clang/test/CodeGen/aarch64-pure-scalable-args.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ void test_va_arg(int n, ...) {
405405

406406
// CHECK-AAPCS-NEXT: %new_reg_offs = add nsw i32 %gr_offs, 8
407407
// CHECK-AAPCS-NEXT: store i32 %new_reg_offs, ptr %gr_offs_p, align 8
408-
// CHECK-AAPCS-NEXT: %inreg = icmp ult i32 %gr_offs, -7
408+
// CHECK-AAPCS-NEXT: %inreg = icmp samesign ult i32 %gr_offs, -7
409409
// CHECK-AAPCS-NEXT: br i1 %inreg, label %vaarg.in_reg, label %vaarg.on_stack
410410
// CHECK-AAPCS-EMPTY:
411411
// CHECK-AAPCS-NEXT: vaarg.in_reg: ; preds = %vaarg.maybe_reg

llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -288,24 +288,35 @@ static bool processICmp(ICmpInst *Cmp, LazyValueInfo *LVI) {
288288
if (!Cmp->getOperand(0)->getType()->isIntOrIntVectorTy())
289289
return false;
290290

291-
if (!Cmp->isSigned())
291+
if (!Cmp->isSigned() && (!Cmp->isUnsigned() || Cmp->hasSameSign()))
292292
return false;
293293

294-
ICmpInst::Predicate UnsignedPred =
295-
ConstantRange::getEquivalentPredWithFlippedSignedness(
296-
Cmp->getPredicate(),
297-
LVI->getConstantRangeAtUse(Cmp->getOperandUse(0),
298-
/*UndefAllowed*/ true),
299-
LVI->getConstantRangeAtUse(Cmp->getOperandUse(1),
300-
/*UndefAllowed*/ true));
294+
bool Changed = false;
301295

302-
if (UnsignedPred == ICmpInst::Predicate::BAD_ICMP_PREDICATE)
303-
return false;
296+
ConstantRange CR1 = LVI->getConstantRangeAtUse(Cmp->getOperandUse(0),
297+
/*UndefAllowed=*/false),
298+
CR2 = LVI->getConstantRangeAtUse(Cmp->getOperandUse(1),
299+
/*UndefAllowed=*/false);
304300

305-
++NumSICmps;
306-
Cmp->setPredicate(UnsignedPred);
301+
if (Cmp->isSigned()) {
302+
ICmpInst::Predicate UnsignedPred =
303+
ConstantRange::getEquivalentPredWithFlippedSignedness(
304+
Cmp->getPredicate(), CR1, CR2);
307305

308-
return true;
306+
if (UnsignedPred == ICmpInst::Predicate::BAD_ICMP_PREDICATE)
307+
return false;
308+
309+
++NumSICmps;
310+
Cmp->setPredicate(UnsignedPred);
311+
Changed = true;
312+
}
313+
314+
if (ConstantRange::areInsensitiveToSignednessOfICmpPredicate(CR1, CR2)) {
315+
Cmp->setSameSign();
316+
Changed = true;
317+
}
318+
319+
return Changed;
309320
}
310321

311322
/// See if LazyValueInfo's ability to exploit edge conditions or range

llvm/test/Transforms/CorrelatedValuePropagation/ashr.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,10 @@ define void @test5(i32 %n) {
133133
; CHECK-NEXT: br i1 [[CMP]], label %[[LOOP:.*]], label %[[EXIT:.*]]
134134
; CHECK: [[LOOP]]:
135135
; CHECK-NEXT: [[A:%.*]] = phi i32 [ [[N]], %[[ENTRY]] ], [ [[SHR:%.*]], %[[LOOP]] ]
136-
; CHECK-NEXT: [[COND:%.*]] = icmp ugt i32 [[A]], 4
136+
; CHECK-NEXT: [[COND:%.*]] = icmp samesign ugt i32 [[A]], 4
137137
; CHECK-NEXT: call void @llvm.assume(i1 [[COND]])
138138
; CHECK-NEXT: [[SHR]] = lshr i32 [[A]], 1
139-
; CHECK-NEXT: [[LOOPCOND:%.*]] = icmp ugt i32 [[SHR]], 8
139+
; CHECK-NEXT: [[LOOPCOND:%.*]] = icmp samesign ugt i32 [[SHR]], 8
140140
; CHECK-NEXT: br i1 [[LOOPCOND]], label %[[LOOP]], label %[[EXIT]]
141141
; CHECK: [[EXIT]]:
142142
; CHECK-NEXT: ret void

llvm/test/Transforms/CorrelatedValuePropagation/basic.ll

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ define i1 @umin(i32 %a, i32 %b) {
579579
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[B]], 20
580580
; CHECK-NEXT: br i1 [[CMP2]], label [[B_GUARD:%.*]], label [[OUT]]
581581
; CHECK: b_guard:
582-
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp ult i32 [[A]], [[B]]
582+
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp samesign ult i32 [[A]], [[B]]
583583
; CHECK-NEXT: [[MIN:%.*]] = select i1 [[SEL_CMP]], i32 [[A]], i32 [[B]]
584584
; CHECK-NEXT: ret i1 false
585585
; CHECK: out:
@@ -612,7 +612,7 @@ define i1 @smin(i32 %a, i32 %b) {
612612
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[B]], 20
613613
; CHECK-NEXT: br i1 [[CMP2]], label [[B_GUARD:%.*]], label [[OUT]]
614614
; CHECK: b_guard:
615-
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp ule i32 [[A]], [[B]]
615+
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp samesign ule i32 [[A]], [[B]]
616616
; CHECK-NEXT: [[MIN:%.*]] = select i1 [[SEL_CMP]], i32 [[A]], i32 [[B]]
617617
; CHECK-NEXT: ret i1 false
618618
; CHECK: out:
@@ -645,7 +645,7 @@ define i1 @smax(i32 %a, i32 %b) {
645645
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[B]], 20
646646
; CHECK-NEXT: br i1 [[CMP2]], label [[B_GUARD:%.*]], label [[OUT]]
647647
; CHECK: b_guard:
648-
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp uge i32 [[A]], [[B]]
648+
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp samesign uge i32 [[A]], [[B]]
649649
; CHECK-NEXT: [[MAX:%.*]] = select i1 [[SEL_CMP]], i32 [[A]], i32 [[B]]
650650
; CHECK-NEXT: ret i1 false
651651
; CHECK: out:
@@ -678,7 +678,7 @@ define i1 @umax(i32 %a, i32 %b) {
678678
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[B]], 20
679679
; CHECK-NEXT: br i1 [[CMP2]], label [[B_GUARD:%.*]], label [[OUT]]
680680
; CHECK: b_guard:
681-
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp uge i32 [[A]], [[B]]
681+
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp samesign uge i32 [[A]], [[B]]
682682
; CHECK-NEXT: [[MAX:%.*]] = select i1 [[SEL_CMP]], i32 [[A]], i32 [[B]]
683683
; CHECK-NEXT: ret i1 false
684684
; CHECK: out:
@@ -824,7 +824,7 @@ define i1 @clamp_low3(i32 noundef %a) {
824824
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[A]], 5
825825
; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]]
826826
; CHECK: a_guard:
827-
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp ugt i32 [[A]], 5
827+
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp samesign ugt i32 [[A]], 5
828828
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], -1
829829
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 [[ADD]], i32 5
830830
; CHECK-NEXT: ret i1 false
@@ -852,7 +852,7 @@ define i1 @clamp_low4(i32 noundef %a) {
852852
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[A]], 5
853853
; CHECK-NEXT: br i1 [[CMP]], label [[A_GUARD:%.*]], label [[OUT:%.*]]
854854
; CHECK: a_guard:
855-
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp ule i32 [[A]], 5
855+
; CHECK-NEXT: [[SEL_CMP:%.*]] = icmp samesign ule i32 [[A]], 5
856856
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[A]], -1
857857
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[SEL_CMP]], i32 5, i32 [[ADD]]
858858
; CHECK-NEXT: ret i1 false
@@ -1085,10 +1085,10 @@ define void @abs1(i32 %a, ptr %p) {
10851085
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A]], 0
10861086
; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 [[A]]
10871087
; CHECK-NEXT: store i1 true, ptr [[P]], align 1
1088-
; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[ABS]], 19
1088+
; CHECK-NEXT: [[C2:%.*]] = icmp samesign ult i32 [[ABS]], 19
10891089
; CHECK-NEXT: store i1 [[C2]], ptr [[P]], align 1
10901090
; CHECK-NEXT: store i1 true, ptr [[P]], align 1
1091-
; CHECK-NEXT: [[C4:%.*]] = icmp uge i32 [[ABS]], 1
1091+
; CHECK-NEXT: [[C4:%.*]] = icmp samesign uge i32 [[ABS]], 1
10921092
; CHECK-NEXT: store i1 [[C4]], ptr [[P]], align 1
10931093
; CHECK-NEXT: br label [[EXIT]]
10941094
; CHECK: exit:
@@ -1131,10 +1131,10 @@ define void @abs2(i32 %a, ptr %p) {
11311131
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[A]], 0
11321132
; CHECK-NEXT: [[ABS:%.*]] = select i1 [[CMP]], i32 [[A]], i32 [[SUB]]
11331133
; CHECK-NEXT: store i1 true, ptr [[P]], align 1
1134-
; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[ABS]], 19
1134+
; CHECK-NEXT: [[C2:%.*]] = icmp samesign ult i32 [[ABS]], 19
11351135
; CHECK-NEXT: store i1 [[C2]], ptr [[P]], align 1
11361136
; CHECK-NEXT: store i1 true, ptr [[P]], align 1
1137-
; CHECK-NEXT: [[C4:%.*]] = icmp uge i32 [[ABS]], 1
1137+
; CHECK-NEXT: [[C4:%.*]] = icmp samesign uge i32 [[ABS]], 1
11381138
; CHECK-NEXT: store i1 [[C4]], ptr [[P]], align 1
11391139
; CHECK-NEXT: br label [[EXIT]]
11401140
; CHECK: exit:
@@ -1934,7 +1934,7 @@ define void @select_assume(i32 %a, i32 %b, i1 %c, ptr %p) {
19341934
; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[B]], 20
19351935
; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
19361936
; CHECK-NEXT: [[S:%.*]] = select i1 [[C]], i32 [[A]], i32 [[B]]
1937-
; CHECK-NEXT: [[C3:%.*]] = icmp ult i32 [[S]], 19
1937+
; CHECK-NEXT: [[C3:%.*]] = icmp samesign ult i32 [[S]], 19
19381938
; CHECK-NEXT: store i1 [[C3]], ptr [[P]], align 1
19391939
; CHECK-NEXT: store i1 true, ptr [[P]], align 1
19401940
; CHECK-NEXT: ret void
@@ -1957,10 +1957,10 @@ define void @xor(i8 %a, ptr %p) {
19571957
; CHECK-NEXT: [[A_MASK:%.*]] = and i8 [[A]], 15
19581958
; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[A_MASK]], -86
19591959
; CHECK-NEXT: store i1 true, ptr [[P]], align 1
1960-
; CHECK-NEXT: [[C2:%.*]] = icmp ugt i8 [[XOR]], -96
1960+
; CHECK-NEXT: [[C2:%.*]] = icmp samesign ugt i8 [[XOR]], -96
19611961
; CHECK-NEXT: store i1 [[C2]], ptr [[P]], align 1
19621962
; CHECK-NEXT: store i1 true, ptr [[P]], align 1
1963-
; CHECK-NEXT: [[C4:%.*]] = icmp ult i8 [[XOR]], -81
1963+
; CHECK-NEXT: [[C4:%.*]] = icmp samesign ult i8 [[XOR]], -81
19641964
; CHECK-NEXT: store i1 [[C4]], ptr [[P]], align 1
19651965
; CHECK-NEXT: ret void
19661966
;

llvm/test/Transforms/CorrelatedValuePropagation/cond-using-block-value.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ define void @test_icmp_from_implied_cond(i32 %a, i32 %b) {
1313
; CHECK-NEXT: br i1 [[COND]], label [[L2:%.*]], label [[END]]
1414
; CHECK: l2:
1515
; CHECK-NEXT: call void @use(i1 true)
16-
; CHECK-NEXT: [[B_CMP2:%.*]] = icmp ult i32 [[B]], 31
16+
; CHECK-NEXT: [[B_CMP2:%.*]] = icmp samesign ult i32 [[B]], 31
1717
; CHECK-NEXT: call void @use(i1 [[B_CMP2]])
1818
; CHECK-NEXT: ret void
1919
; CHECK: end:
@@ -74,7 +74,7 @@ define void @test_icmp_from_implied_range(i16 %x, i32 %b) {
7474
; CHECK-NEXT: br i1 [[COND]], label [[L1:%.*]], label [[END:%.*]]
7575
; CHECK: l1:
7676
; CHECK-NEXT: call void @use(i1 true)
77-
; CHECK-NEXT: [[B_CMP2:%.*]] = icmp ult i32 [[B]], 65534
77+
; CHECK-NEXT: [[B_CMP2:%.*]] = icmp samesign ult i32 [[B]], 65534
7878
; CHECK-NEXT: call void @use(i1 [[B_CMP2]])
7979
; CHECK-NEXT: ret void
8080
; CHECK: end:

llvm/test/Transforms/CorrelatedValuePropagation/deopt.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ define void @test3(i1 %c, i1 %c2) {
9797
; CHECK-LABEL: @test3(
9898
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i64 0, i64 1
9999
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C2:%.*]], i64 [[SEL]], i64 2
100-
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[SEL2]], 1
100+
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i64 [[SEL2]], 1
101101
; CHECK-NEXT: br i1 [[CMP]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]
102102
; CHECK: taken:
103103
; CHECK-NEXT: call void @use() [ "deopt"(i64 2) ]
@@ -122,7 +122,7 @@ define void @test4(i1 %c, i1 %c2) {
122122
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[C2:%.*]], i64 0, i64 1
123123
; CHECK-NEXT: [[ADD1:%.*]] = add nuw nsw i64 0, [[SEL]]
124124
; CHECK-NEXT: [[ADD2:%.*]] = add nuw nsw i64 [[ADD1]], [[SEL2]]
125-
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[ADD2]], 1
125+
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i64 [[ADD2]], 1
126126
; CHECK-NEXT: br i1 [[CMP]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]]
127127
; CHECK: taken:
128128
; CHECK-NEXT: call void @use() [ "deopt"(i64 2) ]

llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ define i1 @test4(i32 %x, i32 %y) #0 {
128128
; CHECK-NEXT: br i1 [[CMP2]], label [[CONT2:%.*]], label [[OUT]]
129129
; CHECK: cont2:
130130
; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i32 [[X]], [[Y]]
131-
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[ADD]], 15
131+
; CHECK-NEXT: [[CMP3:%.*]] = icmp samesign ult i32 [[ADD]], 15
132132
; CHECK-NEXT: br label [[OUT]]
133133
; CHECK: out:
134134
; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ true, [[CONT1]] ], [ [[CMP3]], [[CONT2]] ]
@@ -198,7 +198,7 @@ define i1 @test6(i32 %x, i32 %y) #0 {
198198
; CHECK-NEXT: br i1 [[CMP2]], label [[CONT2:%.*]], label [[OUT]]
199199
; CHECK: cont2:
200200
; CHECK-NEXT: [[SHIFTED:%.*]] = shl nuw nsw i32 [[X]], [[Y]]
201-
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[SHIFTED]], 65536
201+
; CHECK-NEXT: [[CMP3:%.*]] = icmp samesign ult i32 [[SHIFTED]], 65536
202202
; CHECK-NEXT: br label [[OUT]]
203203
; CHECK: out:
204204
; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ true, [[CONT1]] ], [ [[CMP3]], [[CONT2]] ]
@@ -1265,7 +1265,7 @@ define void @ashr_sgt(i8 %x) {
12651265
; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
12661266
; CHECK: if:
12671267
; CHECK-NEXT: call void @check1(i1 true)
1268-
; CHECK-NEXT: [[C3:%.*]] = icmp ugt i8 [[X]], 8
1268+
; CHECK-NEXT: [[C3:%.*]] = icmp samesign ugt i8 [[X]], 8
12691269
; CHECK-NEXT: call void @check1(i1 [[C3]])
12701270
; CHECK-NEXT: ret void
12711271
; CHECK: else:
@@ -1291,7 +1291,7 @@ define void @ashr_sge(i8 %x) {
12911291
; CHECK-NEXT: br i1 [[C]], label [[IF:%.*]], label [[ELSE:%.*]]
12921292
; CHECK: if:
12931293
; CHECK-NEXT: call void @check1(i1 true)
1294-
; CHECK-NEXT: [[C3:%.*]] = icmp uge i8 [[X]], 5
1294+
; CHECK-NEXT: [[C3:%.*]] = icmp samesign uge i8 [[X]], 5
12951295
; CHECK-NEXT: call void @check1(i1 [[C3]])
12961296
; CHECK-NEXT: ret void
12971297
; CHECK: else:
@@ -1374,7 +1374,7 @@ define i1 @pr69928(i64 noundef %arg, i64 noundef %arg1) {
13741374
; CHECK-NEXT: entry:
13751375
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i64 [[ARG:%.*]], 64424509440
13761376
; CHECK-NEXT: [[AND:%.*]] = and i64 [[ARG1:%.*]], 4294967295
1377-
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i64 [[ARG]], [[AND]]
1377+
; CHECK-NEXT: [[CMP2:%.*]] = icmp samesign ult i64 [[ARG]], [[AND]]
13781378
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 false
13791379
; CHECK-NEXT: ret i1 [[SELECT]]
13801380
;
@@ -1390,7 +1390,7 @@ define i1 @test_select_flip(i64 noundef %arg) {
13901390
; CHECK-LABEL: @test_select_flip(
13911391
; CHECK-NEXT: entry:
13921392
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i64 [[ARG:%.*]], 1000
1393-
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i64 [[ARG]], 100
1393+
; CHECK-NEXT: [[CMP2:%.*]] = icmp samesign ult i64 [[ARG]], 100
13941394
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 false
13951395
; CHECK-NEXT: ret i1 [[SELECT]]
13961396
;

llvm/test/Transforms/CorrelatedValuePropagation/minmaxabs.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ define void @test_umin(i32 %x) {
1212
; CHECK-LABEL: @test_umin(
1313
; CHECK-NEXT: [[M:%.*]] = call i32 @llvm.umin.i32(i32 [[X:%.*]], i32 10)
1414
; CHECK-NEXT: call void @use(i1 true)
15-
; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[M]], 10
15+
; CHECK-NEXT: [[C2:%.*]] = icmp samesign ult i32 [[M]], 10
1616
; CHECK-NEXT: call void @use(i1 [[C2]])
1717
; CHECK-NEXT: ret void
1818
;
@@ -60,7 +60,7 @@ define void @test_smax(i32 %x) {
6060
; CHECK-LABEL: @test_smax(
6161
; CHECK-NEXT: [[M:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 10)
6262
; CHECK-NEXT: call void @use(i1 true)
63-
; CHECK-NEXT: [[C2:%.*]] = icmp ugt i32 [[M]], 10
63+
; CHECK-NEXT: [[C2:%.*]] = icmp samesign ugt i32 [[M]], 10
6464
; CHECK-NEXT: call void @use(i1 [[C2]])
6565
; CHECK-NEXT: ret void
6666
;
@@ -77,7 +77,7 @@ define void @test_abs1(ptr %p) {
7777
; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0:![0-9]+]]
7878
; CHECK-NEXT: [[A:%.*]] = call i32 @llvm.abs.i32(i32 [[X]], i1 true)
7979
; CHECK-NEXT: call void @use(i1 true)
80-
; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[A]], 15
80+
; CHECK-NEXT: [[C2:%.*]] = icmp samesign ult i32 [[A]], 15
8181
; CHECK-NEXT: call void @use(i1 [[C2]])
8282
; CHECK-NEXT: ret void
8383
;
@@ -110,7 +110,7 @@ define void @test_abs3(i32 %x) {
110110
; CHECK-LABEL: @test_abs3(
111111
; CHECK-NEXT: [[A:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 true)
112112
; CHECK-NEXT: call void @use(i1 true)
113-
; CHECK-NEXT: [[C2:%.*]] = icmp ugt i32 [[A]], 0
113+
; CHECK-NEXT: [[C2:%.*]] = icmp samesign ugt i32 [[A]], 0
114114
; CHECK-NEXT: call void @use(i1 [[C2]])
115115
; CHECK-NEXT: ret void
116116
;

llvm/test/Transforms/CorrelatedValuePropagation/overflow_predicate.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ define i1 @uadd_ov_true(i8 %x, ptr %px, ptr %pc) {
4949
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
5050
; CHECK-NEXT: br i1 [[OV]], label [[OVERFLOW:%.*]], label [[TRAP:%.*]]
5151
; CHECK: overflow:
52-
; CHECK-NEXT: [[C1:%.*]] = icmp ugt i8 [[X]], -100
52+
; CHECK-NEXT: [[C1:%.*]] = icmp samesign ugt i8 [[X]], -100
5353
; CHECK-NEXT: store i1 [[C1]], ptr [[PC:%.*]], align 1
5454
; CHECK-NEXT: ret i1 true
5555
; CHECK: trap:
@@ -113,7 +113,7 @@ define i1 @sadd_ov_true(i8 %x, ptr %px, ptr %pc) {
113113
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
114114
; CHECK-NEXT: br i1 [[OV]], label [[OVERFLOW:%.*]], label [[TRAP:%.*]]
115115
; CHECK: overflow:
116-
; CHECK-NEXT: [[C1:%.*]] = icmp ugt i8 [[X]], 28
116+
; CHECK-NEXT: [[C1:%.*]] = icmp samesign ugt i8 [[X]], 28
117117
; CHECK-NEXT: store i1 [[C1]], ptr [[PC:%.*]], align 1
118118
; CHECK-NEXT: ret i1 true
119119
; CHECK: trap:
@@ -177,7 +177,7 @@ define i1 @usub_ov_true(i8 %x, ptr %px, ptr %pc) {
177177
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
178178
; CHECK-NEXT: br i1 [[OV]], label [[OVERFLOW:%.*]], label [[TRAP:%.*]]
179179
; CHECK: overflow:
180-
; CHECK-NEXT: [[C1:%.*]] = icmp ult i8 [[X]], 99
180+
; CHECK-NEXT: [[C1:%.*]] = icmp samesign ult i8 [[X]], 99
181181
; CHECK-NEXT: store i1 [[C1]], ptr [[PC:%.*]], align 1
182182
; CHECK-NEXT: ret i1 true
183183
; CHECK: trap:
@@ -241,7 +241,7 @@ define i1 @ssub_ov_true(i8 %x, ptr %px, ptr %pc) {
241241
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
242242
; CHECK-NEXT: br i1 [[OV]], label [[OVERFLOW:%.*]], label [[TRAP:%.*]]
243243
; CHECK: overflow:
244-
; CHECK-NEXT: [[C1:%.*]] = icmp ult i8 [[X]], -29
244+
; CHECK-NEXT: [[C1:%.*]] = icmp samesign ult i8 [[X]], -29
245245
; CHECK-NEXT: store i1 [[C1]], ptr [[PC:%.*]], align 1
246246
; CHECK-NEXT: ret i1 true
247247
; CHECK: trap:
@@ -273,7 +273,7 @@ define i1 @umul_ov_false(i8 %x, ptr %px, ptr %pc) {
273273
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i8, i1 } [[VAL_OV]], 1
274274
; CHECK-NEXT: br i1 [[OV]], label [[TRAP:%.*]], label [[NO_OVERFLOW:%.*]]
275275
; CHECK: no_overflow:
276-
; CHECK-NEXT: [[C1:%.*]] = icmp ugt i8 [[X]], 24
276+
; CHECK-NEXT: [[C1:%.*]] = icmp samesign ugt i8 [[X]], 24
277277
; CHECK-NEXT: store i1 [[C1]], ptr [[PC:%.*]], align 1
278278
; CHECK-NEXT: ret i1 false
279279
; CHECK: trap:

llvm/test/Transforms/CorrelatedValuePropagation/range.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ define i32 @test3(i32 %c) nounwind {
6464
; CHECK: if.then:
6565
; CHECK-NEXT: ret i32 1
6666
; CHECK: if.end:
67-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i32 [[C]], 3
67+
; CHECK-NEXT: [[CMP1:%.*]] = icmp samesign ult i32 [[C]], 3
6868
; CHECK-NEXT: br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END8:%.*]]
6969
; CHECK: if.then2:
7070
; CHECK-NEXT: br i1 true, label [[IF_THEN4:%.*]], label [[IF_END6:%.*]]
@@ -989,11 +989,11 @@ define i1 @ctlz_nofold(i16 %x) {
989989
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[ELSE:%.*]]
990990
; CHECK: if:
991991
; CHECK-NEXT: [[CTLZ:%.*]] = call i16 @llvm.ctlz.i16(i16 [[X]], i1 false)
992-
; CHECK-NEXT: [[RES:%.*]] = icmp uge i16 [[CTLZ]], 9
992+
; CHECK-NEXT: [[RES:%.*]] = icmp samesign uge i16 [[CTLZ]], 9
993993
; CHECK-NEXT: ret i1 [[RES]]
994994
; CHECK: else:
995995
; CHECK-NEXT: [[CTLZ2:%.*]] = call i16 @llvm.ctlz.i16(i16 [[X]], i1 false)
996-
; CHECK-NEXT: [[RES2:%.*]] = icmp ult i16 [[CTLZ2]], 7
996+
; CHECK-NEXT: [[RES2:%.*]] = icmp samesign ult i16 [[CTLZ2]], 7
997997
; CHECK-NEXT: ret i1 [[RES2]]
998998
;
999999
%cmp = icmp ult i16 %x, 256
@@ -1038,7 +1038,7 @@ define i1 @cttz_nofold1(i16 %x) {
10381038
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[ELSE:%.*]]
10391039
; CHECK: if:
10401040
; CHECK-NEXT: [[CTTZ:%.*]] = call i16 @llvm.cttz.i16(i16 [[X]], i1 true)
1041-
; CHECK-NEXT: [[RES:%.*]] = icmp uge i16 [[CTTZ]], 7
1041+
; CHECK-NEXT: [[RES:%.*]] = icmp samesign uge i16 [[CTTZ]], 7
10421042
; CHECK-NEXT: ret i1 [[RES]]
10431043
; CHECK: else:
10441044
; CHECK-NEXT: ret i1 false
@@ -1061,7 +1061,7 @@ define i1 @cttz_nofold2(i16 %x) {
10611061
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[ELSE:%.*]]
10621062
; CHECK: if:
10631063
; CHECK-NEXT: [[CTTZ:%.*]] = call i16 @llvm.cttz.i16(i16 [[X]], i1 false)
1064-
; CHECK-NEXT: [[RES:%.*]] = icmp uge i16 [[CTTZ]], 8
1064+
; CHECK-NEXT: [[RES:%.*]] = icmp samesign uge i16 [[CTTZ]], 8
10651065
; CHECK-NEXT: ret i1 [[RES]]
10661066
; CHECK: else:
10671067
; CHECK-NEXT: ret i1 false
@@ -1106,7 +1106,7 @@ define i1 @ctpop_nofold(i16 %x) {
11061106
; CHECK-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[ELSE:%.*]]
11071107
; CHECK: if:
11081108
; CHECK-NEXT: [[CTPOP:%.*]] = call i16 @llvm.ctpop.i16(i16 [[X]])
1109-
; CHECK-NEXT: [[RES:%.*]] = icmp ule i16 [[CTPOP]], 7
1109+
; CHECK-NEXT: [[RES:%.*]] = icmp samesign ule i16 [[CTPOP]], 7
11101110
; CHECK-NEXT: ret i1 [[RES]]
11111111
; CHECK: else:
11121112
; CHECK-NEXT: ret i1 true

0 commit comments

Comments
 (0)