Home | History | Annotate | Download | only in Reassociate
      1 ; RUN: opt < %s -reassociate -S | FileCheck %s
      2 
      3 ; Tests involving repeated operations on the same value.
      4 
      5 define i8 @nilpotent(i8 %x) {
      6 ; CHECK-LABEL: @nilpotent(
      7   %tmp = xor i8 %x, %x
      8   ret i8 %tmp
      9 ; CHECK: ret i8 0
     10 }
     11 
     12 define i2 @idempotent(i2 %x) {
     13 ; CHECK-LABEL: @idempotent(
     14   %tmp1 = and i2 %x, %x
     15   %tmp2 = and i2 %tmp1, %x
     16   %tmp3 = and i2 %tmp2, %x
     17   ret i2 %tmp3
     18 ; CHECK: ret i2 %x
     19 }
     20 
     21 define i2 @add(i2 %x) {
     22 ; CHECK-LABEL: @add(
     23   %tmp1 = add i2 %x, %x
     24   %tmp2 = add i2 %tmp1, %x
     25   %tmp3 = add i2 %tmp2, %x
     26   ret i2 %tmp3
     27 ; CHECK: ret i2 0
     28 }
     29 
     30 define i2 @cst_add() {
     31 ; CHECK-LABEL: @cst_add(
     32   %tmp1 = add i2 1, 1
     33   %tmp2 = add i2 %tmp1, 1
     34   ret i2 %tmp2
     35 ; CHECK: ret i2 -1
     36 }
     37 
     38 define i8 @cst_mul() {
     39 ; CHECK-LABEL: @cst_mul(
     40   %tmp1 = mul i8 3, 3
     41   %tmp2 = mul i8 %tmp1, 3
     42   %tmp3 = mul i8 %tmp2, 3
     43   %tmp4 = mul i8 %tmp3, 3
     44   ret i8 %tmp4
     45 ; CHECK: ret i8 -13
     46 }
     47 
     48 define i3 @foo3x5(i3 %x) {
     49 ; Can be done with two multiplies.
     50 ; CHECK-LABEL: @foo3x5(
     51 ; CHECK-NEXT: mul
     52 ; CHECK-NEXT: mul
     53 ; CHECK-NEXT: ret
     54   %tmp1 = mul i3 %x, %x
     55   %tmp2 = mul i3 %tmp1, %x
     56   %tmp3 = mul i3 %tmp2, %x
     57   %tmp4 = mul i3 %tmp3, %x
     58   ret i3 %tmp4
     59 }
     60 
     61 define i3 @foo3x6(i3 %x) {
     62 ; Can be done with two multiplies.
     63 ; CHECK-LABEL: @foo3x6(
     64 ; CHECK-NEXT: mul
     65 ; CHECK-NEXT: mul
     66 ; CHECK-NEXT: ret
     67   %tmp1 = mul i3 %x, %x
     68   %tmp2 = mul i3 %tmp1, %x
     69   %tmp3 = mul i3 %tmp2, %x
     70   %tmp4 = mul i3 %tmp3, %x
     71   %tmp5 = mul i3 %tmp4, %x
     72   ret i3 %tmp5
     73 }
     74 
     75 define i3 @foo3x7(i3 %x) {
     76 ; Can be done with two multiplies.
     77 ; CHECK-LABEL: @foo3x7(
     78 ; CHECK-NEXT: mul
     79 ; CHECK-NEXT: mul
     80 ; CHECK-NEXT: ret
     81   %tmp1 = mul i3 %x, %x
     82   %tmp2 = mul i3 %tmp1, %x
     83   %tmp3 = mul i3 %tmp2, %x
     84   %tmp4 = mul i3 %tmp3, %x
     85   %tmp5 = mul i3 %tmp4, %x
     86   %tmp6 = mul i3 %tmp5, %x
     87   ret i3 %tmp6
     88 }
     89 
     90 define i4 @foo4x8(i4 %x) {
     91 ; Can be done with two multiplies.
     92 ; CHECK-LABEL: @foo4x8(
     93 ; CHECK-NEXT: mul
     94 ; CHECK-NEXT: mul
     95 ; CHECK-NEXT: ret
     96   %tmp1 = mul i4 %x, %x
     97   %tmp2 = mul i4 %tmp1, %x
     98   %tmp3 = mul i4 %tmp2, %x
     99   %tmp4 = mul i4 %tmp3, %x
    100   %tmp5 = mul i4 %tmp4, %x
    101   %tmp6 = mul i4 %tmp5, %x
    102   %tmp7 = mul i4 %tmp6, %x
    103   ret i4 %tmp7
    104 }
    105 
    106 define i4 @foo4x9(i4 %x) {
    107 ; Can be done with three multiplies.
    108 ; CHECK-LABEL: @foo4x9(
    109 ; CHECK-NEXT: mul
    110 ; CHECK-NEXT: mul
    111 ; CHECK-NEXT: mul
    112 ; CHECK-NEXT: ret
    113   %tmp1 = mul i4 %x, %x
    114   %tmp2 = mul i4 %tmp1, %x
    115   %tmp3 = mul i4 %tmp2, %x
    116   %tmp4 = mul i4 %tmp3, %x
    117   %tmp5 = mul i4 %tmp4, %x
    118   %tmp6 = mul i4 %tmp5, %x
    119   %tmp7 = mul i4 %tmp6, %x
    120   %tmp8 = mul i4 %tmp7, %x
    121   ret i4 %tmp8
    122 }
    123 
    124 define i4 @foo4x10(i4 %x) {
    125 ; Can be done with three multiplies.
    126 ; CHECK-LABEL: @foo4x10(
    127 ; CHECK-NEXT: mul
    128 ; CHECK-NEXT: mul
    129 ; CHECK-NEXT: mul
    130 ; CHECK-NEXT: ret
    131   %tmp1 = mul i4 %x, %x
    132   %tmp2 = mul i4 %tmp1, %x
    133   %tmp3 = mul i4 %tmp2, %x
    134   %tmp4 = mul i4 %tmp3, %x
    135   %tmp5 = mul i4 %tmp4, %x
    136   %tmp6 = mul i4 %tmp5, %x
    137   %tmp7 = mul i4 %tmp6, %x
    138   %tmp8 = mul i4 %tmp7, %x
    139   %tmp9 = mul i4 %tmp8, %x
    140   ret i4 %tmp9
    141 }
    142 
    143 define i4 @foo4x11(i4 %x) {
    144 ; Can be done with four multiplies.
    145 ; CHECK-LABEL: @foo4x11(
    146 ; CHECK-NEXT: mul
    147 ; CHECK-NEXT: mul
    148 ; CHECK-NEXT: mul
    149 ; CHECK-NEXT: mul
    150 ; CHECK-NEXT: ret
    151   %tmp1 = mul i4 %x, %x
    152   %tmp2 = mul i4 %tmp1, %x
    153   %tmp3 = mul i4 %tmp2, %x
    154   %tmp4 = mul i4 %tmp3, %x
    155   %tmp5 = mul i4 %tmp4, %x
    156   %tmp6 = mul i4 %tmp5, %x
    157   %tmp7 = mul i4 %tmp6, %x
    158   %tmp8 = mul i4 %tmp7, %x
    159   %tmp9 = mul i4 %tmp8, %x
    160   %tmp10 = mul i4 %tmp9, %x
    161   ret i4 %tmp10
    162 }
    163 
    164 define i4 @foo4x12(i4 %x) {
    165 ; Can be done with two multiplies.
    166 ; CHECK-LABEL: @foo4x12(
    167 ; CHECK-NEXT: mul
    168 ; CHECK-NEXT: mul
    169 ; CHECK-NEXT: ret
    170   %tmp1 = mul i4 %x, %x
    171   %tmp2 = mul i4 %tmp1, %x
    172   %tmp3 = mul i4 %tmp2, %x
    173   %tmp4 = mul i4 %tmp3, %x
    174   %tmp5 = mul i4 %tmp4, %x
    175   %tmp6 = mul i4 %tmp5, %x
    176   %tmp7 = mul i4 %tmp6, %x
    177   %tmp8 = mul i4 %tmp7, %x
    178   %tmp9 = mul i4 %tmp8, %x
    179   %tmp10 = mul i4 %tmp9, %x
    180   %tmp11 = mul i4 %tmp10, %x
    181   ret i4 %tmp11
    182 }
    183 
    184 define i4 @foo4x13(i4 %x) {
    185 ; Can be done with three multiplies.
    186 ; CHECK-LABEL: @foo4x13(
    187 ; CHECK-NEXT: mul
    188 ; CHECK-NEXT: mul
    189 ; CHECK-NEXT: mul
    190 ; CHECK-NEXT: ret
    191   %tmp1 = mul i4 %x, %x
    192   %tmp2 = mul i4 %tmp1, %x
    193   %tmp3 = mul i4 %tmp2, %x
    194   %tmp4 = mul i4 %tmp3, %x
    195   %tmp5 = mul i4 %tmp4, %x
    196   %tmp6 = mul i4 %tmp5, %x
    197   %tmp7 = mul i4 %tmp6, %x
    198   %tmp8 = mul i4 %tmp7, %x
    199   %tmp9 = mul i4 %tmp8, %x
    200   %tmp10 = mul i4 %tmp9, %x
    201   %tmp11 = mul i4 %tmp10, %x
    202   %tmp12 = mul i4 %tmp11, %x
    203   ret i4 %tmp12
    204 }
    205 
    206 define i4 @foo4x14(i4 %x) {
    207 ; Can be done with three multiplies.
    208 ; CHECK-LABEL: @foo4x14(
    209 ; CHECK-NEXT: mul
    210 ; CHECK-NEXT: mul
    211 ; CHECK-NEXT: mul
    212 ; CHECK-NEXT: ret
    213   %tmp1 = mul i4 %x, %x
    214   %tmp2 = mul i4 %tmp1, %x
    215   %tmp3 = mul i4 %tmp2, %x
    216   %tmp4 = mul i4 %tmp3, %x
    217   %tmp5 = mul i4 %tmp4, %x
    218   %tmp6 = mul i4 %tmp5, %x
    219   %tmp7 = mul i4 %tmp6, %x
    220   %tmp8 = mul i4 %tmp7, %x
    221   %tmp9 = mul i4 %tmp8, %x
    222   %tmp10 = mul i4 %tmp9, %x
    223   %tmp11 = mul i4 %tmp10, %x
    224   %tmp12 = mul i4 %tmp11, %x
    225   %tmp13 = mul i4 %tmp12, %x
    226   ret i4 %tmp13
    227 }
    228 
    229 define i4 @foo4x15(i4 %x) {
    230 ; Can be done with four multiplies.
    231 ; CHECK-LABEL: @foo4x15(
    232 ; CHECK-NEXT: mul
    233 ; CHECK-NEXT: mul
    234 ; CHECK-NEXT: mul
    235 ; CHECK-NEXT: mul
    236 ; CHECK-NEXT: ret
    237   %tmp1 = mul i4 %x, %x
    238   %tmp2 = mul i4 %tmp1, %x
    239   %tmp3 = mul i4 %tmp2, %x
    240   %tmp4 = mul i4 %tmp3, %x
    241   %tmp5 = mul i4 %tmp4, %x
    242   %tmp6 = mul i4 %tmp5, %x
    243   %tmp7 = mul i4 %tmp6, %x
    244   %tmp8 = mul i4 %tmp7, %x
    245   %tmp9 = mul i4 %tmp8, %x
    246   %tmp10 = mul i4 %tmp9, %x
    247   %tmp11 = mul i4 %tmp10, %x
    248   %tmp12 = mul i4 %tmp11, %x
    249   %tmp13 = mul i4 %tmp12, %x
    250   %tmp14 = mul i4 %tmp13, %x
    251   ret i4 %tmp14
    252 }
    253