Home | History | Annotate | Download | only in InstCombine
      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