Home | History | Annotate | Download | only in AArch64
      1 ; RUN: llc < %s -mtriple=aarch64-linux-gnuabi -O2 | FileCheck %s
      2 
      3 ; The following cases are for i16
      4 
      5 %struct.s_signed_i16 = type { i16, i16, i16 }
      6 %struct.s_unsigned_i16 = type { i16, i16, i16 }
      7 
      8 @cost_s_i8_i16 = common global %struct.s_signed_i16 zeroinitializer, align 2
      9 @cost_u_i16 = common global %struct.s_unsigned_i16 zeroinitializer, align 2
     10 
     11 define void @test_i16_2cmp_signed_1() {
     12 ; CHECK-LABEL: test_i16_2cmp_signed_1
     13 ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
     14 ; CHECK-NEXT: b.gt
     15 ; CHECK-NOT: cmp
     16 ; CHECK: b.ne
     17 entry:
     18   %0 = load i16, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 1), align 2
     19   %1 = load i16, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 2), align 2
     20   %cmp = icmp sgt i16 %0, %1
     21   br i1 %cmp, label %if.then, label %if.else
     22 
     23 if.then:                                          ; preds = %entry
     24   store i16 %0, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 0), align 2
     25   br label %if.end8
     26 
     27 if.else:                                          ; preds = %entry
     28   %cmp5 = icmp eq i16 %0, %1
     29   br i1 %cmp5, label %if.then7, label %if.end8
     30 
     31 if.then7:                                         ; preds = %if.else
     32   store i16 %0, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 0), align 2
     33   br label %if.end8
     34 
     35 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
     36   ret void
     37 }
     38 
     39 define void @test_i16_2cmp_signed_2() {
     40 ; CHECK-LABEL: test_i16_2cmp_signed_2
     41 ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
     42 ; CHECK-NEXT: b.le
     43 ; CHECK-NOT: cmp
     44 ; CHECK: b.ge
     45 entry:
     46   %0 = load i16, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 1), align 2
     47   %1 = load i16, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 2), align 2
     48   %cmp = icmp sgt i16 %0, %1
     49   br i1 %cmp, label %if.then, label %if.else
     50 
     51 if.then:                                          ; preds = %entry
     52   store i16 %0, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 0), align 2
     53   br label %if.end8
     54 
     55 if.else:                                          ; preds = %entry
     56   %cmp5 = icmp slt i16 %0, %1
     57   br i1 %cmp5, label %if.then7, label %if.end8
     58 
     59 if.then7:                                         ; preds = %if.else
     60   store i16 %1, i16* getelementptr inbounds (%struct.s_signed_i16, %struct.s_signed_i16* @cost_s_i8_i16, i64 0, i32 0), align 2
     61   br label %if.end8
     62 
     63 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
     64   ret void
     65 }
     66 
     67 define void @test_i16_2cmp_unsigned_1() {
     68 ; CHECK-LABEL: test_i16_2cmp_unsigned_1
     69 ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
     70 ; CHECK-NEXT: b.hi
     71 ; CHECK-NOT: cmp
     72 ; CHECK: b.ne
     73 entry:
     74   %0 = load i16, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 1), align 2
     75   %1 = load i16, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 2), align 2
     76   %cmp = icmp ugt i16 %0, %1
     77   br i1 %cmp, label %if.then, label %if.else
     78 
     79 if.then:                                          ; preds = %entry
     80   store i16 %0, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 0), align 2
     81   br label %if.end8
     82 
     83 if.else:                                          ; preds = %entry
     84   %cmp5 = icmp eq i16 %0, %1
     85   br i1 %cmp5, label %if.then7, label %if.end8
     86 
     87 if.then7:                                         ; preds = %if.else
     88   store i16 %0, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 0), align 2
     89   br label %if.end8
     90 
     91 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
     92   ret void
     93 }
     94 
     95 define void @test_i16_2cmp_unsigned_2() {
     96 ; CHECK-LABEL: test_i16_2cmp_unsigned_2
     97 ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
     98 ; CHECK-NEXT: b.ls
     99 ; CHECK-NOT: cmp
    100 ; CHECK: b.hs
    101 entry:
    102   %0 = load i16, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 1), align 2
    103   %1 = load i16, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 2), align 2
    104   %cmp = icmp ugt i16 %0, %1
    105   br i1 %cmp, label %if.then, label %if.else
    106 
    107 if.then:                                          ; preds = %entry
    108   store i16 %0, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 0), align 2
    109   br label %if.end8
    110 
    111 if.else:                                          ; preds = %entry
    112   %cmp5 = icmp ult i16 %0, %1
    113   br i1 %cmp5, label %if.then7, label %if.end8
    114 
    115 if.then7:                                         ; preds = %if.else
    116   store i16 %1, i16* getelementptr inbounds (%struct.s_unsigned_i16, %struct.s_unsigned_i16* @cost_u_i16, i64 0, i32 0), align 2
    117   br label %if.end8
    118 
    119 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
    120   ret void
    121 }
    122 
    123 ; The following cases are for i8
    124 
    125 %struct.s_signed_i8 = type { i8, i8, i8 }
    126 %struct.s_unsigned_i8 = type { i8, i8, i8 }
    127 
    128 @cost_s = common global %struct.s_signed_i8 zeroinitializer, align 2
    129 @cost_u_i8 = common global %struct.s_unsigned_i8 zeroinitializer, align 2
    130 
    131 
    132 define void @test_i8_2cmp_signed_1() {
    133 ; CHECK-LABEL: test_i8_2cmp_signed_1
    134 ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
    135 ; CHECK-NEXT: b.gt
    136 ; CHECK-NOT: cmp
    137 ; CHECK: b.ne
    138 entry:
    139   %0 = load i8, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 1), align 2
    140   %1 = load i8, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 2), align 2
    141   %cmp = icmp sgt i8 %0, %1
    142   br i1 %cmp, label %if.then, label %if.else
    143 
    144 if.then:                                          ; preds = %entry
    145   store i8 %0, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 0), align 2
    146   br label %if.end8
    147 
    148 if.else:                                          ; preds = %entry
    149   %cmp5 = icmp eq i8 %0, %1
    150   br i1 %cmp5, label %if.then7, label %if.end8
    151 
    152 if.then7:                                         ; preds = %if.else
    153   store i8 %0, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 0), align 2
    154   br label %if.end8
    155 
    156 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
    157   ret void
    158 }
    159 
    160 define void @test_i8_2cmp_signed_2() {
    161 ; CHECK-LABEL: test_i8_2cmp_signed_2
    162 ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
    163 ; CHECK-NEXT: b.le
    164 ; CHECK-NOT: cmp
    165 ; CHECK: b.ge
    166 entry:
    167   %0 = load i8, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 1), align 2
    168   %1 = load i8, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 2), align 2
    169   %cmp = icmp sgt i8 %0, %1
    170   br i1 %cmp, label %if.then, label %if.else
    171 
    172 if.then:                                          ; preds = %entry
    173   store i8 %0, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 0), align 2
    174   br label %if.end8
    175 
    176 if.else:                                          ; preds = %entry
    177   %cmp5 = icmp slt i8 %0, %1
    178   br i1 %cmp5, label %if.then7, label %if.end8
    179 
    180 if.then7:                                         ; preds = %if.else
    181   store i8 %1, i8* getelementptr inbounds (%struct.s_signed_i8, %struct.s_signed_i8* @cost_s, i64 0, i32 0), align 2
    182   br label %if.end8
    183 
    184 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
    185   ret void
    186 }
    187 
    188 define void @test_i8_2cmp_unsigned_1() {
    189 ; CHECK-LABEL: test_i8_2cmp_unsigned_1
    190 ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
    191 ; CHECK-NEXT: b.hi
    192 ; CHECK-NOT: cmp
    193 ; CHECK: b.ne
    194 entry:
    195   %0 = load i8, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 1), align 2
    196   %1 = load i8, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 2), align 2
    197   %cmp = icmp ugt i8 %0, %1
    198   br i1 %cmp, label %if.then, label %if.else
    199 
    200 if.then:                                          ; preds = %entry
    201   store i8 %0, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 0), align 2
    202   br label %if.end8
    203 
    204 if.else:                                          ; preds = %entry
    205   %cmp5 = icmp eq i8 %0, %1
    206   br i1 %cmp5, label %if.then7, label %if.end8
    207 
    208 if.then7:                                         ; preds = %if.else
    209   store i8 %0, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 0), align 2
    210   br label %if.end8
    211 
    212 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
    213   ret void
    214 }
    215 
    216 define void @test_i8_2cmp_unsigned_2() {
    217 ; CHECK-LABEL: test_i8_2cmp_unsigned_2
    218 ; CHECK: cmp {{w[0-9]+}}, {{w[0-9]+}}
    219 ; CHECK-NEXT: b.ls
    220 ; CHECK-NOT: cmp
    221 ; CHECK: b.hs
    222 entry:
    223   %0 = load i8, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 1), align 2
    224   %1 = load i8, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 2), align 2
    225   %cmp = icmp ugt i8 %0, %1
    226   br i1 %cmp, label %if.then, label %if.else
    227 
    228 if.then:                                          ; preds = %entry
    229   store i8 %0, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 0), align 2
    230   br label %if.end8
    231 
    232 if.else:                                          ; preds = %entry
    233   %cmp5 = icmp ult i8 %0, %1
    234   br i1 %cmp5, label %if.then7, label %if.end8
    235 
    236 if.then7:                                         ; preds = %if.else
    237   store i8 %1, i8* getelementptr inbounds (%struct.s_unsigned_i8, %struct.s_unsigned_i8* @cost_u_i8, i64 0, i32 0), align 2
    238   br label %if.end8
    239 
    240 if.end8:                                          ; preds = %if.else, %if.then7, %if.then
    241   ret void
    242 }
    243 
    244 ; Make sure the case below won't crash.
    245 
    246 ; The optimization of ZERO_EXTEND and SIGN_EXTEND in type legalization stage can't assert
    247 ; the operand of a set_cc is always a TRUNCATE.
    248 
    249 define i1 @foo(float %inl, float %inr) {
    250   %lval = fptosi float %inl to i8
    251   %rval = fptosi float %inr to i8
    252   %sum = icmp eq i8 %lval, %rval
    253   ret i1 %sum
    254 }
    255