1 ; RUN: opt < %s -instcombine -S | FileCheck %s 2 3 @G16 = internal constant [10 x i16] [i16 35, i16 82, i16 69, i16 81, i16 85, 4 i16 73, i16 82, i16 69, i16 68, i16 0] 5 @GD = internal constant [6 x double] 6 [double -10.0, double 1.0, double 4.0, double 2.0, double -20.0, double -40.0] 7 8 define i1 @test1(i32 %X) { 9 %P = getelementptr inbounds [10 x i16]* @G16, i32 0, i32 %X 10 %Q = load i16* %P 11 %R = icmp eq i16 %Q, 0 12 ret i1 %R 13 ; CHECK: @test1 14 ; CHECK-NEXT: %R = icmp eq i32 %X, 9 15 ; CHECK-NEXT: ret i1 %R 16 } 17 18 define i1 @test2(i32 %X) { 19 %P = getelementptr inbounds [10 x i16]* @G16, i32 0, i32 %X 20 %Q = load i16* %P 21 %R = icmp slt i16 %Q, 85 22 ret i1 %R 23 ; CHECK: @test2 24 ; CHECK-NEXT: %R = icmp ne i32 %X, 4 25 ; CHECK-NEXT: ret i1 %R 26 } 27 28 define i1 @test3(i32 %X) { 29 %P = getelementptr inbounds [6 x double]* @GD, i32 0, i32 %X 30 %Q = load double* %P 31 %R = fcmp oeq double %Q, 1.0 32 ret i1 %R 33 ; CHECK: @test3 34 ; CHECK-NEXT: %R = icmp eq i32 %X, 1 35 ; CHECK-NEXT: ret i1 %R 36 } 37 38 define i1 @test4(i32 %X) { 39 %P = getelementptr inbounds [10 x i16]* @G16, i32 0, i32 %X 40 %Q = load i16* %P 41 %R = icmp sle i16 %Q, 73 42 ret i1 %R 43 ; CHECK: @test4 44 ; CHECK-NEXT: lshr i32 933, %X 45 ; CHECK-NEXT: and i32 {{.*}}, 1 46 ; CHECK-NEXT: %R = icmp ne i32 {{.*}}, 0 47 ; CHECK-NEXT: ret i1 %R 48 } 49 50 define i1 @test5(i32 %X) { 51 %P = getelementptr inbounds [10 x i16]* @G16, i32 0, i32 %X 52 %Q = load i16* %P 53 %R = icmp eq i16 %Q, 69 54 ret i1 %R 55 ; CHECK: @test5 56 ; CHECK-NEXT: icmp eq i32 %X, 2 57 ; CHECK-NEXT: icmp eq i32 %X, 7 58 ; CHECK-NEXT: %R = or i1 59 ; CHECK-NEXT: ret i1 %R 60 } 61 62 define i1 @test6(i32 %X) { 63 %P = getelementptr inbounds [6 x double]* @GD, i32 0, i32 %X 64 %Q = load double* %P 65 %R = fcmp ogt double %Q, 0.0 66 ret i1 %R 67 ; CHECK: @test6 68 ; CHECK-NEXT: add i32 %X, -1 69 ; CHECK-NEXT: %R = icmp ult i32 {{.*}}, 3 70 ; CHECK-NEXT: ret i1 %R 71 } 72 73 define i1 @test7(i32 %X) { 74 %P = getelementptr inbounds [6 x double]* @GD, i32 0, i32 %X 75 %Q = load double* %P 76 %R = fcmp olt double %Q, 0.0 77 ret i1 %R 78 ; CHECK: @test7 79 ; CHECK-NEXT: add i32 %X, -1 80 ; CHECK-NEXT: %R = icmp ugt i32 {{.*}}, 2 81 ; CHECK-NEXT: ret i1 %R 82 } 83 84 define i1 @test8(i32 %X) { 85 %P = getelementptr inbounds [10 x i16]* @G16, i32 0, i32 %X 86 %Q = load i16* %P 87 %R = and i16 %Q, 3 88 %S = icmp eq i16 %R, 0 89 ret i1 %S 90 ; CHECK: @test8 91 ; CHECK-NEXT: add i32 %X, -8 92 ; CHECK-NEXT: icmp ult i32 {{.*}}, 2 93 ; CHECK-NEXT: ret i1 94 } 95 96 @GA = internal constant [4 x { i32, i32 } ] [ 97 { i32, i32 } { i32 1, i32 0 }, 98 { i32, i32 } { i32 2, i32 1 }, 99 { i32, i32 } { i32 3, i32 1 }, 100 { i32, i32 } { i32 4, i32 0 } 101 ] 102 103 define i1 @test9(i32 %X) { 104 %P = getelementptr inbounds [4 x { i32, i32 } ]* @GA, i32 0, i32 %X, i32 1 105 %Q = load i32* %P 106 %R = icmp eq i32 %Q, 1 107 ret i1 %R 108 ; CHECK: @test9 109 ; CHECK-NEXT: add i32 %X, -1 110 ; CHECK-NEXT: icmp ult i32 {{.*}}, 2 111 ; CHECK-NEXT: ret i1 112 } 113