1; RUN: opt -S %s -instsimplify | FileCheck %s 2 3; A ==> A -> true 4define i1 @test(i32 %length.i, i32 %i) { 5; CHECK-LABEL: @test 6; CHECK: ret i1 true 7 %var29 = icmp slt i32 %i, %length.i 8 %res = icmp uge i1 %var29, %var29 9 ret i1 %res 10} 11 12; i +_{nsw} C_{>0} <s L ==> i <s L -> true 13define i1 @test2(i32 %length.i, i32 %i) { 14; CHECK-LABEL: @test2 15; CHECK: ret i1 true 16 %iplus1 = add nsw i32 %i, 1 17 %var29 = icmp slt i32 %i, %length.i 18 %var30 = icmp slt i32 %iplus1, %length.i 19 %res = icmp ule i1 %var30, %var29 20 ret i1 %res 21} 22 23; i + C_{>0} <s L ==> i <s L -> unknown without the nsw 24define i1 @test2_neg(i32 %length.i, i32 %i) { 25; CHECK-LABEL: @test2_neg 26; CHECK: ret i1 %res 27 %iplus1 = add i32 %i, 1 28 %var29 = icmp slt i32 %i, %length.i 29 %var30 = icmp slt i32 %iplus1, %length.i 30 %res = icmp ule i1 %var30, %var29 31 ret i1 %res 32} 33 34; sle is not implication 35define i1 @test2_neg2(i32 %length.i, i32 %i) { 36; CHECK-LABEL: @test2_neg2 37; CHECK: ret i1 %res 38 %iplus1 = add i32 %i, 1 39 %var29 = icmp slt i32 %i, %length.i 40 %var30 = icmp slt i32 %iplus1, %length.i 41 %res = icmp sle i1 %var30, %var29 42 ret i1 %res 43} 44 45; The binary operator has to be an add 46define i1 @test2_neg3(i32 %length.i, i32 %i) { 47; CHECK-LABEL: @test2_neg3 48; CHECK: ret i1 %res 49 %iplus1 = sub nsw i32 %i, 1 50 %var29 = icmp slt i32 %i, %length.i 51 %var30 = icmp slt i32 %iplus1, %length.i 52 %res = icmp ule i1 %var30, %var29 53 ret i1 %res 54} 55 56; i +_{nsw} C_{>0} <s L ==> i <s L -> true 57; With an inverted conditional (ule B A rather than canonical ugt A B 58define i1 @test3(i32 %length.i, i32 %i) { 59; CHECK-LABEL: @test3 60; CHECK: ret i1 true 61 %iplus1 = add nsw i32 %i, 1 62 %var29 = icmp slt i32 %i, %length.i 63 %var30 = icmp slt i32 %iplus1, %length.i 64 %res = icmp uge i1 %var29, %var30 65 ret i1 %res 66} 67 68; i +_{nuw} C_{>0} <u L ==> i <u L 69define i1 @test4(i32 %length.i, i32 %i) { 70; CHECK-LABEL: @test4 71; CHECK: ret i1 true 72 %iplus1 = add nuw i32 %i, 1 73 %var29 = icmp ult i32 %i, %length.i 74 %var30 = icmp ult i32 %iplus1, %length.i 75 %res = icmp ule i1 %var30, %var29 76 ret i1 %res 77} 78