1; RUN: opt < %s -reassociate -S | FileCheck %s 2 3; Tests involving repeated operations on the same value. 4 5define i8 @nilpotent(i8 %x) { 6; CHECK: @nilpotent 7 %tmp = xor i8 %x, %x 8 ret i8 %tmp 9; CHECK: ret i8 0 10} 11 12define i2 @idempotent(i2 %x) { 13; CHECK: @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 21define i2 @add(i2 %x) { 22; CHECK: @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 30define i2 @cst_add() { 31; CHECK: @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 38define i8 @cst_mul() { 39; CHECK: @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 48define i3 @foo3x5(i3 %x) { 49; Can be done with two multiplies. 50; CHECK: @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 61define i3 @foo3x6(i3 %x) { 62; Can be done with two multiplies. 63; CHECK: @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 75define i3 @foo3x7(i3 %x) { 76; Can be done with two multiplies. 77; CHECK: @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 90define i4 @foo4x8(i4 %x) { 91; Can be done with two multiplies. 92; CHECK: @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 106define i4 @foo4x9(i4 %x) { 107; Can be done with three multiplies. 108; CHECK: @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 124define i4 @foo4x10(i4 %x) { 125; Can be done with three multiplies. 126; CHECK: @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 143define i4 @foo4x11(i4 %x) { 144; Can be done with four multiplies. 145; CHECK: @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 164define i4 @foo4x12(i4 %x) { 165; Can be done with two multiplies. 166; CHECK: @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 184define i4 @foo4x13(i4 %x) { 185; Can be done with three multiplies. 186; CHECK: @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 206define i4 @foo4x14(i4 %x) { 207; Can be done with three multiplies. 208; CHECK: @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 229define i4 @foo4x15(i4 %x) { 230; Can be done with four multiplies. 231; CHECK: @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