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-LABEL: @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-LABEL: @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-LABEL: @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-LABEL: @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 @test4_i16(i16 %X) { 51 %P = getelementptr inbounds [10 x i16]* @G16, i32 0, i16 %X 52 %Q = load i16* %P 53 %R = icmp sle i16 %Q, 73 54 ret i1 %R 55 ; CHECK-LABEL: @test4_i16( 56 ; CHECK-NEXT: lshr i16 933, %X 57 ; CHECK-NEXT: and i16 {{.*}}, 1 58 ; CHECK-NEXT: %R = icmp ne i16 {{.*}}, 0 59 ; CHECK-NEXT: ret i1 %R 60 } 61 62 define i1 @test5(i32 %X) { 63 %P = getelementptr inbounds [10 x i16]* @G16, i32 0, i32 %X 64 %Q = load i16* %P 65 %R = icmp eq i16 %Q, 69 66 ret i1 %R 67 ; CHECK-LABEL: @test5( 68 ; CHECK-NEXT: icmp eq i32 %X, 2 69 ; CHECK-NEXT: icmp eq i32 %X, 7 70 ; CHECK-NEXT: %R = or i1 71 ; CHECK-NEXT: ret i1 %R 72 } 73 74 define i1 @test6(i32 %X) { 75 %P = getelementptr inbounds [6 x double]* @GD, i32 0, i32 %X 76 %Q = load double* %P 77 %R = fcmp ogt double %Q, 0.0 78 ret i1 %R 79 ; CHECK-LABEL: @test6( 80 ; CHECK-NEXT: add i32 %X, -1 81 ; CHECK-NEXT: %R = icmp ult i32 {{.*}}, 3 82 ; CHECK-NEXT: ret i1 %R 83 } 84 85 define i1 @test7(i32 %X) { 86 %P = getelementptr inbounds [6 x double]* @GD, i32 0, i32 %X 87 %Q = load double* %P 88 %R = fcmp olt double %Q, 0.0 89 ret i1 %R 90 ; CHECK-LABEL: @test7( 91 ; CHECK-NEXT: add i32 %X, -1 92 ; CHECK-NEXT: %R = icmp ugt i32 {{.*}}, 2 93 ; CHECK-NEXT: ret i1 %R 94 } 95 96 define i1 @test8(i32 %X) { 97 %P = getelementptr inbounds [10 x i16]* @G16, i32 0, i32 %X 98 %Q = load i16* %P 99 %R = and i16 %Q, 3 100 %S = icmp eq i16 %R, 0 101 ret i1 %S 102 ; CHECK-LABEL: @test8( 103 ; CHECK-NEXT: and i32 %X, -2 104 ; CHECK-NEXT: icmp eq i32 {{.*}}, 8 105 ; CHECK-NEXT: ret i1 106 } 107 108 @GA = internal constant [4 x { i32, i32 } ] [ 109 { i32, i32 } { i32 1, i32 0 }, 110 { i32, i32 } { i32 2, i32 1 }, 111 { i32, i32 } { i32 3, i32 1 }, 112 { i32, i32 } { i32 4, i32 0 } 113 ] 114 115 define i1 @test9(i32 %X) { 116 %P = getelementptr inbounds [4 x { i32, i32 } ]* @GA, i32 0, i32 %X, i32 1 117 %Q = load i32* %P 118 %R = icmp eq i32 %Q, 1 119 ret i1 %R 120 ; CHECK-LABEL: @test9( 121 ; CHECK-NEXT: add i32 %X, -1 122 ; CHECK-NEXT: icmp ult i32 {{.*}}, 2 123 ; CHECK-NEXT: ret i1 124 } 125