Skip to content

Commit b1c59b5

Browse files
authored
[SCCP] Infer nneg on zext when forming from non-negative sext. (llvm#70730)
Builds on llvm#67982 which recently introduced the nneg flag on a zext instruction.
1 parent 91cdd7d commit b1c59b5

File tree

6 files changed

+15
-14
lines changed

6 files changed

+15
-14
lines changed

llvm/lib/Transforms/Utils/SCCPSolver.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ static bool replaceSignedInst(SCCPSolver &Solver,
171171
if (InsertedValues.count(Op0) || !isNonNegative(Op0))
172172
return false;
173173
NewInst = new ZExtInst(Op0, Inst.getType(), "", &Inst);
174+
NewInst->setNonNeg();
174175
break;
175176
}
176177
case Instruction::AShr: {

llvm/test/Transforms/SCCP/add-nuw-nsw-flags.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ define i16 @sge_with_sext_to_zext_conversion(i8 %a) {
124124
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[A:%.*]], 0
125125
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
126126
; CHECK: then:
127-
; CHECK-NEXT: [[SEXT:%.*]] = zext i8 [[A]] to i16
127+
; CHECK-NEXT: [[SEXT:%.*]] = zext nneg i8 [[A]] to i16
128128
; CHECK-NEXT: [[ADD_1:%.*]] = add i16 [[SEXT]], 1
129129
; CHECK-NEXT: [[ADD_2:%.*]] = add i16 [[SEXT]], -128
130130
; CHECK-NEXT: [[ADD_3:%.*]] = add i16 [[SEXT]], -127
@@ -219,7 +219,7 @@ define i16 @test_add_in_different_block(i1 %c, i8 %a) {
219219
; CHECK-NEXT: entry:
220220
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A:%.*]], 0
221221
; CHECK-NEXT: [[COND4:%.*]] = select i1 [[CMP]], i8 1, i8 0
222-
; CHECK-NEXT: [[CONV:%.*]] = zext i8 [[COND4]] to i16
222+
; CHECK-NEXT: [[CONV:%.*]] = zext nneg i8 [[COND4]] to i16
223223
; CHECK-NEXT: br i1 [[C:%.*]], label [[THEN:%.*]], label [[ELSE:%.*]]
224224
; CHECK: then:
225225
; CHECK-NEXT: [[ADD:%.*]] = add i16 1, [[CONV]]

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ define i1 @caller.zext() {
112112
; x = [100, 301)
113113
define internal i1 @f.sext(i32 %x, i32 %y) {
114114
; CHECK-LABEL: @f.sext(
115-
; CHECK-NEXT: [[T_1:%.*]] = zext i32 [[X:%.*]] to i64
115+
; CHECK-NEXT: [[T_1:%.*]] = zext nneg i32 [[X:%.*]] to i64
116116
; CHECK-NEXT: [[C_2:%.*]] = icmp sgt i64 [[T_1]], 299
117117
; CHECK-NEXT: [[C_4:%.*]] = icmp slt i64 [[T_1]], 101
118118
; CHECK-NEXT: [[RES_1:%.*]] = add nuw nsw i1 false, [[C_2]]
@@ -318,7 +318,7 @@ entry:
318318

319319
define internal i64 @f.sext_to_zext(i32 %t) {
320320
; CHECK-LABEL: @f.sext_to_zext(
321-
; CHECK-NEXT: [[A:%.*]] = zext i32 [[T:%.*]] to i64
321+
; CHECK-NEXT: [[A:%.*]] = zext nneg i32 [[T:%.*]] to i64
322322
; CHECK-NEXT: ret i64 [[A]]
323323
;
324324
%a = sext i32 %t to i64

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ define i64 @test1(i32 %x) {
66
; CHECK-NEXT: [[C:%.*]] = icmp sgt i32 [[X:%.*]], 0
77
; CHECK-NEXT: br i1 [[C]], label [[TRUE:%.*]], label [[FALSE:%.*]]
88
; CHECK: true:
9-
; CHECK-NEXT: [[EXT_1:%.*]] = zext i32 [[X]] to i64
9+
; CHECK-NEXT: [[EXT_1:%.*]] = zext nneg i32 [[X]] to i64
1010
; CHECK-NEXT: ret i64 [[EXT_1]]
1111
; CHECK: false:
1212
; CHECK-NEXT: [[EXT_2:%.*]] = sext i32 [[X]] to i64
@@ -29,7 +29,7 @@ define i64 @test2(i32 %x) {
2929
; CHECK-NEXT: [[C:%.*]] = icmp sge i32 [[X:%.*]], 0
3030
; CHECK-NEXT: br i1 [[C]], label [[TRUE:%.*]], label [[FALSE:%.*]]
3131
; CHECK: true:
32-
; CHECK-NEXT: [[EXT_1:%.*]] = zext i32 [[X]] to i64
32+
; CHECK-NEXT: [[EXT_1:%.*]] = zext nneg i32 [[X]] to i64
3333
; CHECK-NEXT: ret i64 [[EXT_1]]
3434
; CHECK: false:
3535
; CHECK-NEXT: [[EXT_2:%.*]] = sext i32 [[X]] to i64
@@ -105,7 +105,7 @@ exit:
105105
define i64 @test5(i32 %x) {
106106
; CHECK-LABEL: @test5(
107107
; CHECK-NEXT: [[P:%.*]] = and i32 [[X:%.*]], 15
108-
; CHECK-NEXT: [[EXT:%.*]] = zext i32 [[P]] to i64
108+
; CHECK-NEXT: [[EXT:%.*]] = zext nneg i32 [[P]] to i64
109109
; CHECK-NEXT: ret i64 [[EXT]]
110110
;
111111
%p = and i32 %x, 15
@@ -126,7 +126,7 @@ define i64 @test6(i32 %x) {
126126
define i64 @test7(i16 %x) {
127127
; CHECK-LABEL: @test7(
128128
; CHECK-NEXT: [[P:%.*]] = and i16 [[X:%.*]], 15
129-
; CHECK-NEXT: [[EXT_1:%.*]] = zext i16 [[P]] to i32
129+
; CHECK-NEXT: [[EXT_1:%.*]] = zext nneg i16 [[P]] to i32
130130
; CHECK-NEXT: [[EXT_2:%.*]] = sext i32 [[EXT_1]] to i64
131131
; CHECK-NEXT: ret i64 [[EXT_2]]
132132
;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ exit:
6868
define i64 @test2(i32 %x) {
6969
; CHECK-LABEL: @test2(
7070
; CHECK-NEXT: [[P:%.*]] = and i32 [[X:%.*]], 15
71-
; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[P]] to i64
72-
; CHECK-NEXT: ret i64 [[TMP1]]
71+
; CHECK-NEXT: [[EXT:%.*]] = zext nneg i32 [[P]] to i64
72+
; CHECK-NEXT: ret i64 [[EXT]]
7373
;
7474
%p = and i32 %x, 15
7575
%ext = sext i32 %p to i64
@@ -87,8 +87,8 @@ define i64 @test3(i1 %c.1, i1 %c.2) {
8787
; CHECK-NEXT: br label [[EXIT]]
8888
; CHECK: exit:
8989
; CHECK-NEXT: [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ 3, [[FALSE]] ]
90-
; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[P]] to i64
91-
; CHECK-NEXT: ret i64 [[TMP1]]
90+
; CHECK-NEXT: [[EXT:%.*]] = zext nneg i32 [[P]] to i64
91+
; CHECK-NEXT: ret i64 [[EXT]]
9292
;
9393
br i1 %c.1, label %true.1, label %false
9494

llvm/test/Transforms/SCCP/widening.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ define void @foo(ptr %arg) {
450450
; SCCP-NEXT: [[TMP7:%.*]] = sub nuw nsw i64 3, [[TMP6]]
451451
; SCCP-NEXT: [[TMP8:%.*]] = shl nuw nsw i64 [[TMP7]], 1
452452
; SCCP-NEXT: [[TMP9:%.*]] = trunc i64 [[TMP8]] to i32
453-
; SCCP-NEXT: [[TMP10:%.*]] = zext i32 [[TMP9]] to i64
453+
; SCCP-NEXT: [[TMP10:%.*]] = zext nneg i32 [[TMP9]] to i64
454454
; SCCP-NEXT: br label [[BB11:%.*]]
455455
; SCCP: bb11:
456456
; SCCP-NEXT: [[TMP12:%.*]] = phi i64 [ [[TMP10]], [[BB4]] ], [ [[TMP17:%.*]], [[BB18:%.*]] ]
@@ -487,7 +487,7 @@ define void @foo(ptr %arg) {
487487
; IPSCCP-NEXT: [[TMP7:%.*]] = sub nuw nsw i64 3, [[TMP6]]
488488
; IPSCCP-NEXT: [[TMP8:%.*]] = shl nuw nsw i64 [[TMP7]], 1
489489
; IPSCCP-NEXT: [[TMP9:%.*]] = trunc i64 [[TMP8]] to i32
490-
; IPSCCP-NEXT: [[TMP10:%.*]] = zext i32 [[TMP9]] to i64
490+
; IPSCCP-NEXT: [[TMP10:%.*]] = zext nneg i32 [[TMP9]] to i64
491491
; IPSCCP-NEXT: br label [[BB11:%.*]]
492492
; IPSCCP: bb11:
493493
; IPSCCP-NEXT: [[TMP12:%.*]] = phi i64 [ [[TMP10]], [[BB4]] ], [ [[TMP17:%.*]], [[BB18:%.*]] ]

0 commit comments

Comments
 (0)