@@ -114,6 +114,57 @@ failed:
114
114
ret i32 -2
115
115
}
116
116
117
+ ; Range info is missing for x, cannot prove no-overflow. Should not hoist.
118
+ define i32 @test_01_neg (ptr %p , ptr %x_p , ptr %length_p ) {
119
+ ; CHECK-LABEL: define i32 @test_01_neg
120
+ ; CHECK-SAME: (ptr [[P:%.*]], ptr [[X_P:%.*]], ptr [[LENGTH_P:%.*]]) {
121
+ ; CHECK-NEXT: entry:
122
+ ; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[X_P]], align 4
123
+ ; CHECK-NEXT: [[LENGTH:%.*]] = load i32, ptr [[LENGTH_P]], align 4, !range [[RNG0]]
124
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
125
+ ; CHECK: loop:
126
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]
127
+ ; CHECK-NEXT: [[ARITH:%.*]] = sub nsw i32 [[X]], [[IV]]
128
+ ; CHECK-NEXT: [[X_CHECK:%.*]] = icmp slt i32 [[ARITH]], 4
129
+ ; CHECK-NEXT: br i1 [[X_CHECK]], label [[OUT_OF_BOUNDS:%.*]], label [[BACKEDGE]]
130
+ ; CHECK: backedge:
131
+ ; CHECK-NEXT: [[EL_PTR:%.*]] = getelementptr i32, ptr [[P]], i32 [[IV]]
132
+ ; CHECK-NEXT: store i32 1, ptr [[EL_PTR]], align 4
133
+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 4
134
+ ; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV_NEXT]], [[LENGTH]]
135
+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]]
136
+ ; CHECK: exit:
137
+ ; CHECK-NEXT: [[IV_NEXT_LCSSA:%.*]] = phi i32 [ [[IV_NEXT]], [[BACKEDGE]] ]
138
+ ; CHECK-NEXT: ret i32 [[IV_NEXT_LCSSA]]
139
+ ; CHECK: out_of_bounds:
140
+ ; CHECK-NEXT: ret i32 -1
141
+ ;
142
+ entry:
143
+ %x = load i32 , ptr %x_p
144
+ %length = load i32 , ptr %length_p , !range !0
145
+ br label %loop
146
+
147
+ loop:
148
+ %iv = phi i32 [0 , %entry ], [%iv.next , %backedge ]
149
+ %arith = sub nsw i32 %x , %iv
150
+ %x_check = icmp slt i32 %arith , 4
151
+ br i1 %x_check , label %out_of_bounds , label %backedge
152
+
153
+ backedge:
154
+ %el.ptr = getelementptr i32 , ptr %p , i32 %iv
155
+ store i32 1 , ptr %el.ptr
156
+ %iv.next = add nuw nsw i32 %iv , 4
157
+ %loop_cond = icmp slt i32 %iv.next , %length
158
+ br i1 %loop_cond , label %loop , label %exit
159
+
160
+ exit:
161
+ ret i32 %iv.next
162
+
163
+ out_of_bounds:
164
+ ret i32 -1
165
+ }
166
+
167
+
117
168
; TODO: x + iv < 4 ==> iv < 4 - x
118
169
define i32 @test_02 (ptr %p , ptr %x_p , ptr %length_p ) {
119
170
; CHECK-LABEL: define i32 @test_02
0 commit comments