@@ -242,6 +242,35 @@ exit:
242242 ret i32 %iv
243243}
244244
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+
245274; turn to %iv >=s smax(inv_1, inv_2) and hoist it out of loop.
246275define i32 @test_sge (i32 %start , i32 %inv_1 , i32 %inv_2 ) {
247276; CHECK-LABEL: @test_sge(
@@ -272,6 +301,35 @@ exit:
272301 ret i32 %iv
273302}
274303
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+
275333; Turn OR to AND and handle accordingly.
276334define i32 @test_ult_inv (i32 %start , i32 %inv_1 , i32 %inv_2 ) {
277335; CHECK-LABEL: @test_ult_inv(
0 commit comments