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 8define 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 18define 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 28define 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 38define 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 50define 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 62define 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 74define 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 85define 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 96define 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 115define 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