@@ -242,6 +242,35 @@ exit:
242
242
ret i32 %iv
243
243
}
244
244
245
+ define i32 @test_sgt_samesign (i32 %start , i32 %inv_1 , i32 %inv_2 ) {
246
+ ; CHECK-LABEL: @test_sgt_samesign(
247
+ ; CHECK-NEXT: entry:
248
+ ; CHECK-NEXT: [[INVARIANT_SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[INV_1:%.*]], i32 [[INV_2:%.*]])
249
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
250
+ ; CHECK: loop:
251
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
252
+ ; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp sgt i32 [[IV]], [[INVARIANT_SMAX]]
253
+ ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
254
+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]]
255
+ ; CHECK: exit:
256
+ ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i32 [ [[IV]], [[LOOP]] ]
257
+ ; CHECK-NEXT: ret i32 [[IV_LCSSA]]
258
+ ;
259
+ entry:
260
+ br label %loop
261
+
262
+ loop:
263
+ %iv = phi i32 [%start , %entry ], [%iv.next , %loop ]
264
+ %cmp_1 = icmp samesign ugt i32 %iv , %inv_1
265
+ %cmp_2 = icmp sgt i32 %iv , %inv_2
266
+ %loop_cond = and i1 %cmp_1 , %cmp_2
267
+ %iv.next = add i32 %iv , 1
268
+ br i1 %loop_cond , label %loop , label %exit
269
+
270
+ exit:
271
+ ret i32 %iv
272
+ }
273
+
245
274
; turn to %iv >=s smax(inv_1, inv_2) and hoist it out of loop.
246
275
define i32 @test_sge (i32 %start , i32 %inv_1 , i32 %inv_2 ) {
247
276
; CHECK-LABEL: @test_sge(
@@ -272,6 +301,35 @@ exit:
272
301
ret i32 %iv
273
302
}
274
303
304
+ define i32 @test_sge_samesign (i32 %start , i32 %inv_1 , i32 %inv_2 ) {
305
+ ; CHECK-LABEL: @test_sge_samesign(
306
+ ; CHECK-NEXT: entry:
307
+ ; CHECK-NEXT: [[INVARIANT_SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[INV_1:%.*]], i32 [[INV_2:%.*]])
308
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
309
+ ; CHECK: loop:
310
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
311
+ ; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp sge i32 [[IV]], [[INVARIANT_SMAX]]
312
+ ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
313
+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]]
314
+ ; CHECK: exit:
315
+ ; CHECK-NEXT: [[IV_LCSSA:%.*]] = phi i32 [ [[IV]], [[LOOP]] ]
316
+ ; CHECK-NEXT: ret i32 [[IV_LCSSA]]
317
+ ;
318
+ entry:
319
+ br label %loop
320
+
321
+ loop:
322
+ %iv = phi i32 [%start , %entry ], [%iv.next , %loop ]
323
+ %cmp_1 = icmp sge i32 %iv , %inv_1
324
+ %cmp_2 = icmp samesign uge i32 %iv , %inv_2
325
+ %loop_cond = and i1 %cmp_1 , %cmp_2
326
+ %iv.next = add i32 %iv , 1
327
+ br i1 %loop_cond , label %loop , label %exit
328
+
329
+ exit:
330
+ ret i32 %iv
331
+ }
332
+
275
333
; Turn OR to AND and handle accordingly.
276
334
define i32 @test_ult_inv (i32 %start , i32 %inv_1 , i32 %inv_2 ) {
277
335
; CHECK-LABEL: @test_ult_inv(
0 commit comments