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: @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: @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: @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: @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 @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 62define 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 73define 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 84define 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 103define 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