Home | History | Annotate | Download | only in SystemZ
      1 ; Test spills of zero extensions when high GR32s are available.
      2 ;
      3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s
      4 
      5 ; Test a case where we spill the source of at least one LLCRMux.  We want
      6 ; to use LLC(H) if possible.
      7 define void @f1(i32 *%ptr) {
      8 ; CHECK-LABEL: f1:
      9 ; CHECK: llc{{h?}} {{%r[0-9]+}}, 16{{[37]}}(%r15)
     10 ; CHECK: br %r14
     11   %val0 = load volatile i32 , i32 *%ptr
     12   %val1 = load volatile i32 , i32 *%ptr
     13   %val2 = load volatile i32 , i32 *%ptr
     14   %val3 = load volatile i32 , i32 *%ptr
     15   %val4 = load volatile i32 , i32 *%ptr
     16   %val5 = load volatile i32 , i32 *%ptr
     17   %val6 = load volatile i32 , i32 *%ptr
     18   %val7 = load volatile i32 , i32 *%ptr
     19   %val8 = load volatile i32 , i32 *%ptr
     20   %val9 = load volatile i32 , i32 *%ptr
     21   %val10 = load volatile i32 , i32 *%ptr
     22   %val11 = load volatile i32 , i32 *%ptr
     23   %val12 = load volatile i32 , i32 *%ptr
     24   %val13 = load volatile i32 , i32 *%ptr
     25   %val14 = load volatile i32 , i32 *%ptr
     26   %val15 = load volatile i32 , i32 *%ptr
     27   %val16 = load volatile i32 , i32 *%ptr
     28   %val17 = load volatile i32 , i32 *%ptr
     29   %val18 = load volatile i32 , i32 *%ptr
     30   %val19 = load volatile i32 , i32 *%ptr
     31   %val20 = load volatile i32 , i32 *%ptr
     32   %val21 = load volatile i32 , i32 *%ptr
     33   %val22 = load volatile i32 , i32 *%ptr
     34   %val23 = load volatile i32 , i32 *%ptr
     35   %val24 = load volatile i32 , i32 *%ptr
     36   %val25 = load volatile i32 , i32 *%ptr
     37   %val26 = load volatile i32 , i32 *%ptr
     38   %val27 = load volatile i32 , i32 *%ptr
     39   %val28 = load volatile i32 , i32 *%ptr
     40   %val29 = load volatile i32 , i32 *%ptr
     41   %val30 = load volatile i32 , i32 *%ptr
     42   %val31 = load volatile i32 , i32 *%ptr
     43 
     44   %trunc0 = trunc i32 %val0 to i8
     45   %trunc1 = trunc i32 %val1 to i8
     46   %trunc2 = trunc i32 %val2 to i8
     47   %trunc3 = trunc i32 %val3 to i8
     48   %trunc4 = trunc i32 %val4 to i8
     49   %trunc5 = trunc i32 %val5 to i8
     50   %trunc6 = trunc i32 %val6 to i8
     51   %trunc7 = trunc i32 %val7 to i8
     52   %trunc8 = trunc i32 %val8 to i8
     53   %trunc9 = trunc i32 %val9 to i8
     54   %trunc10 = trunc i32 %val10 to i8
     55   %trunc11 = trunc i32 %val11 to i8
     56   %trunc12 = trunc i32 %val12 to i8
     57   %trunc13 = trunc i32 %val13 to i8
     58   %trunc14 = trunc i32 %val14 to i8
     59   %trunc15 = trunc i32 %val15 to i8
     60   %trunc16 = trunc i32 %val16 to i8
     61   %trunc17 = trunc i32 %val17 to i8
     62   %trunc18 = trunc i32 %val18 to i8
     63   %trunc19 = trunc i32 %val19 to i8
     64   %trunc20 = trunc i32 %val20 to i8
     65   %trunc21 = trunc i32 %val21 to i8
     66   %trunc22 = trunc i32 %val22 to i8
     67   %trunc23 = trunc i32 %val23 to i8
     68   %trunc24 = trunc i32 %val24 to i8
     69   %trunc25 = trunc i32 %val25 to i8
     70   %trunc26 = trunc i32 %val26 to i8
     71   %trunc27 = trunc i32 %val27 to i8
     72   %trunc28 = trunc i32 %val28 to i8
     73   %trunc29 = trunc i32 %val29 to i8
     74   %trunc30 = trunc i32 %val30 to i8
     75   %trunc31 = trunc i32 %val31 to i8
     76 
     77   %ext0 = zext i8 %trunc0 to i32
     78   %ext1 = zext i8 %trunc1 to i32
     79   %ext2 = zext i8 %trunc2 to i32
     80   %ext3 = zext i8 %trunc3 to i32
     81   %ext4 = zext i8 %trunc4 to i32
     82   %ext5 = zext i8 %trunc5 to i32
     83   %ext6 = zext i8 %trunc6 to i32
     84   %ext7 = zext i8 %trunc7 to i32
     85   %ext8 = zext i8 %trunc8 to i32
     86   %ext9 = zext i8 %trunc9 to i32
     87   %ext10 = zext i8 %trunc10 to i32
     88   %ext11 = zext i8 %trunc11 to i32
     89   %ext12 = zext i8 %trunc12 to i32
     90   %ext13 = zext i8 %trunc13 to i32
     91   %ext14 = zext i8 %trunc14 to i32
     92   %ext15 = zext i8 %trunc15 to i32
     93   %ext16 = zext i8 %trunc16 to i32
     94   %ext17 = zext i8 %trunc17 to i32
     95   %ext18 = zext i8 %trunc18 to i32
     96   %ext19 = zext i8 %trunc19 to i32
     97   %ext20 = zext i8 %trunc20 to i32
     98   %ext21 = zext i8 %trunc21 to i32
     99   %ext22 = zext i8 %trunc22 to i32
    100   %ext23 = zext i8 %trunc23 to i32
    101   %ext24 = zext i8 %trunc24 to i32
    102   %ext25 = zext i8 %trunc25 to i32
    103   %ext26 = zext i8 %trunc26 to i32
    104   %ext27 = zext i8 %trunc27 to i32
    105   %ext28 = zext i8 %trunc28 to i32
    106   %ext29 = zext i8 %trunc29 to i32
    107   %ext30 = zext i8 %trunc30 to i32
    108   %ext31 = zext i8 %trunc31 to i32
    109 
    110   store volatile i32 %val0, i32 *%ptr
    111   store volatile i32 %val1, i32 *%ptr
    112   store volatile i32 %val2, i32 *%ptr
    113   store volatile i32 %val3, i32 *%ptr
    114   store volatile i32 %val4, i32 *%ptr
    115   store volatile i32 %val5, i32 *%ptr
    116   store volatile i32 %val6, i32 *%ptr
    117   store volatile i32 %val7, i32 *%ptr
    118   store volatile i32 %val8, i32 *%ptr
    119   store volatile i32 %val9, i32 *%ptr
    120   store volatile i32 %val10, i32 *%ptr
    121   store volatile i32 %val11, i32 *%ptr
    122   store volatile i32 %val12, i32 *%ptr
    123   store volatile i32 %val13, i32 *%ptr
    124   store volatile i32 %val14, i32 *%ptr
    125   store volatile i32 %val15, i32 *%ptr
    126   store volatile i32 %val16, i32 *%ptr
    127   store volatile i32 %val17, i32 *%ptr
    128   store volatile i32 %val18, i32 *%ptr
    129   store volatile i32 %val19, i32 *%ptr
    130   store volatile i32 %val20, i32 *%ptr
    131   store volatile i32 %val21, i32 *%ptr
    132   store volatile i32 %val22, i32 *%ptr
    133   store volatile i32 %val23, i32 *%ptr
    134   store volatile i32 %val24, i32 *%ptr
    135   store volatile i32 %val25, i32 *%ptr
    136   store volatile i32 %val26, i32 *%ptr
    137   store volatile i32 %val27, i32 *%ptr
    138   store volatile i32 %val28, i32 *%ptr
    139   store volatile i32 %val29, i32 *%ptr
    140   store volatile i32 %val30, i32 *%ptr
    141   store volatile i32 %val31, i32 *%ptr
    142 
    143   store volatile i32 %ext0, i32 *%ptr
    144   store volatile i32 %ext1, i32 *%ptr
    145   store volatile i32 %ext2, i32 *%ptr
    146   store volatile i32 %ext3, i32 *%ptr
    147   store volatile i32 %ext4, i32 *%ptr
    148   store volatile i32 %ext5, i32 *%ptr
    149   store volatile i32 %ext6, i32 *%ptr
    150   store volatile i32 %ext7, i32 *%ptr
    151   store volatile i32 %ext8, i32 *%ptr
    152   store volatile i32 %ext9, i32 *%ptr
    153   store volatile i32 %ext10, i32 *%ptr
    154   store volatile i32 %ext11, i32 *%ptr
    155   store volatile i32 %ext12, i32 *%ptr
    156   store volatile i32 %ext13, i32 *%ptr
    157   store volatile i32 %ext14, i32 *%ptr
    158   store volatile i32 %ext15, i32 *%ptr
    159   store volatile i32 %ext16, i32 *%ptr
    160   store volatile i32 %ext17, i32 *%ptr
    161   store volatile i32 %ext18, i32 *%ptr
    162   store volatile i32 %ext19, i32 *%ptr
    163   store volatile i32 %ext20, i32 *%ptr
    164   store volatile i32 %ext21, i32 *%ptr
    165   store volatile i32 %ext22, i32 *%ptr
    166   store volatile i32 %ext23, i32 *%ptr
    167   store volatile i32 %ext24, i32 *%ptr
    168   store volatile i32 %ext25, i32 *%ptr
    169   store volatile i32 %ext26, i32 *%ptr
    170   store volatile i32 %ext27, i32 *%ptr
    171   store volatile i32 %ext28, i32 *%ptr
    172   store volatile i32 %ext29, i32 *%ptr
    173   store volatile i32 %ext30, i32 *%ptr
    174   store volatile i32 %ext31, i32 *%ptr
    175 
    176   ret void
    177 }
    178 
    179 ; Same again with i16, which should use LLH(H).
    180 define void @f2(i32 *%ptr) {
    181 ; CHECK-LABEL: f2:
    182 ; CHECK: llh{{h?}} {{%r[0-9]+}}, 16{{[26]}}(%r15)
    183 ; CHECK: br %r14
    184   %val0 = load volatile i32 , i32 *%ptr
    185   %val1 = load volatile i32 , i32 *%ptr
    186   %val2 = load volatile i32 , i32 *%ptr
    187   %val3 = load volatile i32 , i32 *%ptr
    188   %val4 = load volatile i32 , i32 *%ptr
    189   %val5 = load volatile i32 , i32 *%ptr
    190   %val6 = load volatile i32 , i32 *%ptr
    191   %val7 = load volatile i32 , i32 *%ptr
    192   %val8 = load volatile i32 , i32 *%ptr
    193   %val9 = load volatile i32 , i32 *%ptr
    194   %val10 = load volatile i32 , i32 *%ptr
    195   %val11 = load volatile i32 , i32 *%ptr
    196   %val12 = load volatile i32 , i32 *%ptr
    197   %val13 = load volatile i32 , i32 *%ptr
    198   %val14 = load volatile i32 , i32 *%ptr
    199   %val15 = load volatile i32 , i32 *%ptr
    200   %val16 = load volatile i32 , i32 *%ptr
    201   %val17 = load volatile i32 , i32 *%ptr
    202   %val18 = load volatile i32 , i32 *%ptr
    203   %val19 = load volatile i32 , i32 *%ptr
    204   %val20 = load volatile i32 , i32 *%ptr
    205   %val21 = load volatile i32 , i32 *%ptr
    206   %val22 = load volatile i32 , i32 *%ptr
    207   %val23 = load volatile i32 , i32 *%ptr
    208   %val24 = load volatile i32 , i32 *%ptr
    209   %val25 = load volatile i32 , i32 *%ptr
    210   %val26 = load volatile i32 , i32 *%ptr
    211   %val27 = load volatile i32 , i32 *%ptr
    212   %val28 = load volatile i32 , i32 *%ptr
    213   %val29 = load volatile i32 , i32 *%ptr
    214   %val30 = load volatile i32 , i32 *%ptr
    215   %val31 = load volatile i32 , i32 *%ptr
    216 
    217   %trunc0 = trunc i32 %val0 to i16
    218   %trunc1 = trunc i32 %val1 to i16
    219   %trunc2 = trunc i32 %val2 to i16
    220   %trunc3 = trunc i32 %val3 to i16
    221   %trunc4 = trunc i32 %val4 to i16
    222   %trunc5 = trunc i32 %val5 to i16
    223   %trunc6 = trunc i32 %val6 to i16
    224   %trunc7 = trunc i32 %val7 to i16
    225   %trunc8 = trunc i32 %val8 to i16
    226   %trunc9 = trunc i32 %val9 to i16
    227   %trunc10 = trunc i32 %val10 to i16
    228   %trunc11 = trunc i32 %val11 to i16
    229   %trunc12 = trunc i32 %val12 to i16
    230   %trunc13 = trunc i32 %val13 to i16
    231   %trunc14 = trunc i32 %val14 to i16
    232   %trunc15 = trunc i32 %val15 to i16
    233   %trunc16 = trunc i32 %val16 to i16
    234   %trunc17 = trunc i32 %val17 to i16
    235   %trunc18 = trunc i32 %val18 to i16
    236   %trunc19 = trunc i32 %val19 to i16
    237   %trunc20 = trunc i32 %val20 to i16
    238   %trunc21 = trunc i32 %val21 to i16
    239   %trunc22 = trunc i32 %val22 to i16
    240   %trunc23 = trunc i32 %val23 to i16
    241   %trunc24 = trunc i32 %val24 to i16
    242   %trunc25 = trunc i32 %val25 to i16
    243   %trunc26 = trunc i32 %val26 to i16
    244   %trunc27 = trunc i32 %val27 to i16
    245   %trunc28 = trunc i32 %val28 to i16
    246   %trunc29 = trunc i32 %val29 to i16
    247   %trunc30 = trunc i32 %val30 to i16
    248   %trunc31 = trunc i32 %val31 to i16
    249 
    250   %ext0 = zext i16 %trunc0 to i32
    251   %ext1 = zext i16 %trunc1 to i32
    252   %ext2 = zext i16 %trunc2 to i32
    253   %ext3 = zext i16 %trunc3 to i32
    254   %ext4 = zext i16 %trunc4 to i32
    255   %ext5 = zext i16 %trunc5 to i32
    256   %ext6 = zext i16 %trunc6 to i32
    257   %ext7 = zext i16 %trunc7 to i32
    258   %ext8 = zext i16 %trunc8 to i32
    259   %ext9 = zext i16 %trunc9 to i32
    260   %ext10 = zext i16 %trunc10 to i32
    261   %ext11 = zext i16 %trunc11 to i32
    262   %ext12 = zext i16 %trunc12 to i32
    263   %ext13 = zext i16 %trunc13 to i32
    264   %ext14 = zext i16 %trunc14 to i32
    265   %ext15 = zext i16 %trunc15 to i32
    266   %ext16 = zext i16 %trunc16 to i32
    267   %ext17 = zext i16 %trunc17 to i32
    268   %ext18 = zext i16 %trunc18 to i32
    269   %ext19 = zext i16 %trunc19 to i32
    270   %ext20 = zext i16 %trunc20 to i32
    271   %ext21 = zext i16 %trunc21 to i32
    272   %ext22 = zext i16 %trunc22 to i32
    273   %ext23 = zext i16 %trunc23 to i32
    274   %ext24 = zext i16 %trunc24 to i32
    275   %ext25 = zext i16 %trunc25 to i32
    276   %ext26 = zext i16 %trunc26 to i32
    277   %ext27 = zext i16 %trunc27 to i32
    278   %ext28 = zext i16 %trunc28 to i32
    279   %ext29 = zext i16 %trunc29 to i32
    280   %ext30 = zext i16 %trunc30 to i32
    281   %ext31 = zext i16 %trunc31 to i32
    282 
    283   store volatile i32 %val0, i32 *%ptr
    284   store volatile i32 %val1, i32 *%ptr
    285   store volatile i32 %val2, i32 *%ptr
    286   store volatile i32 %val3, i32 *%ptr
    287   store volatile i32 %val4, i32 *%ptr
    288   store volatile i32 %val5, i32 *%ptr
    289   store volatile i32 %val6, i32 *%ptr
    290   store volatile i32 %val7, i32 *%ptr
    291   store volatile i32 %val8, i32 *%ptr
    292   store volatile i32 %val9, i32 *%ptr
    293   store volatile i32 %val10, i32 *%ptr
    294   store volatile i32 %val11, i32 *%ptr
    295   store volatile i32 %val12, i32 *%ptr
    296   store volatile i32 %val13, i32 *%ptr
    297   store volatile i32 %val14, i32 *%ptr
    298   store volatile i32 %val15, i32 *%ptr
    299   store volatile i32 %val16, i32 *%ptr
    300   store volatile i32 %val17, i32 *%ptr
    301   store volatile i32 %val18, i32 *%ptr
    302   store volatile i32 %val19, i32 *%ptr
    303   store volatile i32 %val20, i32 *%ptr
    304   store volatile i32 %val21, i32 *%ptr
    305   store volatile i32 %val22, i32 *%ptr
    306   store volatile i32 %val23, i32 *%ptr
    307   store volatile i32 %val24, i32 *%ptr
    308   store volatile i32 %val25, i32 *%ptr
    309   store volatile i32 %val26, i32 *%ptr
    310   store volatile i32 %val27, i32 *%ptr
    311   store volatile i32 %val28, i32 *%ptr
    312   store volatile i32 %val29, i32 *%ptr
    313   store volatile i32 %val30, i32 *%ptr
    314   store volatile i32 %val31, i32 *%ptr
    315 
    316   store volatile i32 %ext0, i32 *%ptr
    317   store volatile i32 %ext1, i32 *%ptr
    318   store volatile i32 %ext2, i32 *%ptr
    319   store volatile i32 %ext3, i32 *%ptr
    320   store volatile i32 %ext4, i32 *%ptr
    321   store volatile i32 %ext5, i32 *%ptr
    322   store volatile i32 %ext6, i32 *%ptr
    323   store volatile i32 %ext7, i32 *%ptr
    324   store volatile i32 %ext8, i32 *%ptr
    325   store volatile i32 %ext9, i32 *%ptr
    326   store volatile i32 %ext10, i32 *%ptr
    327   store volatile i32 %ext11, i32 *%ptr
    328   store volatile i32 %ext12, i32 *%ptr
    329   store volatile i32 %ext13, i32 *%ptr
    330   store volatile i32 %ext14, i32 *%ptr
    331   store volatile i32 %ext15, i32 *%ptr
    332   store volatile i32 %ext16, i32 *%ptr
    333   store volatile i32 %ext17, i32 *%ptr
    334   store volatile i32 %ext18, i32 *%ptr
    335   store volatile i32 %ext19, i32 *%ptr
    336   store volatile i32 %ext20, i32 *%ptr
    337   store volatile i32 %ext21, i32 *%ptr
    338   store volatile i32 %ext22, i32 *%ptr
    339   store volatile i32 %ext23, i32 *%ptr
    340   store volatile i32 %ext24, i32 *%ptr
    341   store volatile i32 %ext25, i32 *%ptr
    342   store volatile i32 %ext26, i32 *%ptr
    343   store volatile i32 %ext27, i32 *%ptr
    344   store volatile i32 %ext28, i32 *%ptr
    345   store volatile i32 %ext29, i32 *%ptr
    346   store volatile i32 %ext30, i32 *%ptr
    347   store volatile i32 %ext31, i32 *%ptr
    348 
    349   ret void
    350 }
    351