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