1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: opt < %s -passes=reassociate -S | FileCheck %s 3 4; Tests involving repeated operations on the same value. 5 6define i8 @nilpotent(i8 %x) { 7; CHECK-LABEL: define i8 @nilpotent( 8; CHECK-SAME: i8 [[X:%.*]]) { 9; CHECK-NEXT: ret i8 0 10; 11 %tmp = xor i8 %x, %x 12 ret i8 %tmp 13} 14 15define i2 @idempotent(i2 %x) { 16; CHECK-LABEL: define i2 @idempotent( 17; CHECK-SAME: i2 [[X:%.*]]) { 18; CHECK-NEXT: ret i2 [[X]] 19; 20 %tmp1 = and i2 %x, %x 21 %tmp2 = and i2 %tmp1, %x 22 %tmp3 = and i2 %tmp2, %x 23 ret i2 %tmp3 24} 25 26define i2 @add(i2 %x) { 27; CHECK-LABEL: define i2 @add( 28; CHECK-SAME: i2 [[X:%.*]]) { 29; CHECK-NEXT: ret i2 0 30; 31 %tmp1 = add i2 %x, %x 32 %tmp2 = add i2 %tmp1, %x 33 %tmp3 = add i2 %tmp2, %x 34 ret i2 %tmp3 35} 36 37define i2 @cst_add() { 38; CHECK-LABEL: define i2 @cst_add() { 39; CHECK-NEXT: ret i2 -1 40; 41 %tmp1 = add i2 1, 1 42 %tmp2 = add i2 %tmp1, 1 43 ret i2 %tmp2 44} 45 46define i8 @cst_mul() { 47; CHECK-LABEL: define i8 @cst_mul() { 48; CHECK-NEXT: ret i8 -13 49; 50 %tmp1 = mul i8 3, 3 51 %tmp2 = mul i8 %tmp1, 3 52 %tmp3 = mul i8 %tmp2, 3 53 %tmp4 = mul i8 %tmp3, 3 54 ret i8 %tmp4 55} 56 57define i3 @foo3x5(i3 %x) { 58; Can be done with two multiplies. 59; CHECK-LABEL: define i3 @foo3x5( 60; CHECK-SAME: i3 [[X:%.*]]) { 61; CHECK-NEXT: [[TMP3:%.*]] = mul i3 [[X]], [[X]] 62; CHECK-NEXT: [[TMP4:%.*]] = mul i3 [[TMP3]], [[X]] 63; CHECK-NEXT: [[TMP5:%.*]] = mul i3 [[TMP4]], [[TMP3]] 64; CHECK-NEXT: ret i3 [[TMP5]] 65; 66 %tmp1 = mul i3 %x, %x 67 %tmp2 = mul i3 %tmp1, %x 68 %tmp3 = mul i3 %tmp2, %x 69 %tmp4 = mul i3 %tmp3, %x 70 ret i3 %tmp4 71} 72 73define i3 @foo3x5_nsw(i3 %x) { 74; Can be done with two multiplies. 75; CHECK-LABEL: define i3 @foo3x5_nsw( 76; CHECK-SAME: i3 [[X:%.*]]) { 77; CHECK-NEXT: [[TMP3:%.*]] = mul i3 [[X]], [[X]] 78; CHECK-NEXT: [[TMP2:%.*]] = mul i3 [[TMP3]], [[X]] 79; CHECK-NEXT: [[TMP4:%.*]] = mul i3 [[TMP2]], [[TMP3]] 80; CHECK-NEXT: ret i3 [[TMP4]] 81; 82 %tmp1 = mul i3 %x, %x 83 %tmp2 = mul i3 %tmp1, %x 84 %tmp3 = mul i3 %tmp2, %x 85 %tmp4 = mul nsw i3 %tmp3, %x 86 ret i3 %tmp4 87} 88 89define i3 @foo3x6(i3 %x) { 90; Can be done with two multiplies. 91; CHECK-LABEL: define i3 @foo3x6( 92; CHECK-SAME: i3 [[X:%.*]]) { 93; CHECK-NEXT: [[TMP1:%.*]] = mul i3 [[X]], [[X]] 94; CHECK-NEXT: [[TMP3:%.*]] = mul i3 [[TMP1]], [[X]] 95; CHECK-NEXT: [[TMP2:%.*]] = mul i3 [[TMP3]], [[TMP3]] 96; CHECK-NEXT: ret i3 [[TMP2]] 97; 98 %tmp1 = mul i3 %x, %x 99 %tmp2 = mul i3 %tmp1, %x 100 %tmp3 = mul i3 %tmp2, %x 101 %tmp4 = mul i3 %tmp3, %x 102 %tmp5 = mul i3 %tmp4, %x 103 ret i3 %tmp5 104} 105 106define i3 @foo3x7(i3 %x) { 107; Can be done with two multiplies. 108; CHECK-LABEL: define i3 @foo3x7( 109; CHECK-SAME: i3 [[X:%.*]]) { 110; CHECK-NEXT: [[TMP5:%.*]] = mul i3 [[X]], [[X]] 111; CHECK-NEXT: [[TMP6:%.*]] = mul i3 [[TMP5]], [[X]] 112; CHECK-NEXT: [[TMP3:%.*]] = mul i3 [[TMP6]], [[X]] 113; CHECK-NEXT: [[TMP7:%.*]] = mul i3 [[TMP3]], [[TMP6]] 114; CHECK-NEXT: ret i3 [[TMP7]] 115; 116 %tmp1 = mul i3 %x, %x 117 %tmp2 = mul i3 %tmp1, %x 118 %tmp3 = mul i3 %tmp2, %x 119 %tmp4 = mul i3 %tmp3, %x 120 %tmp5 = mul i3 %tmp4, %x 121 %tmp6 = mul i3 %tmp5, %x 122 ret i3 %tmp6 123} 124 125define i4 @foo4x8(i4 %x) { 126; Can be done with two multiplies. 127; CHECK-LABEL: define i4 @foo4x8( 128; CHECK-SAME: i4 [[X:%.*]]) { 129; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]] 130; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP1]], [[TMP1]] 131; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP4]], [[TMP4]] 132; CHECK-NEXT: ret i4 [[TMP3]] 133; 134 %tmp1 = mul i4 %x, %x 135 %tmp2 = mul i4 %tmp1, %x 136 %tmp3 = mul i4 %tmp2, %x 137 %tmp4 = mul i4 %tmp3, %x 138 %tmp5 = mul i4 %tmp4, %x 139 %tmp6 = mul i4 %tmp5, %x 140 %tmp7 = mul i4 %tmp6, %x 141 ret i4 %tmp7 142} 143 144define i4 @foo4x9(i4 %x) { 145; Can be done with three multiplies. 146; CHECK-LABEL: define i4 @foo4x9( 147; CHECK-SAME: i4 [[X:%.*]]) { 148; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]] 149; CHECK-NEXT: [[TMP2:%.*]] = mul i4 [[TMP1]], [[TMP1]] 150; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP2]], [[X]] 151; CHECK-NEXT: [[TMP8:%.*]] = mul i4 [[TMP3]], [[TMP2]] 152; CHECK-NEXT: ret i4 [[TMP8]] 153; 154 %tmp1 = mul i4 %x, %x 155 %tmp2 = mul i4 %tmp1, %x 156 %tmp3 = mul i4 %tmp2, %x 157 %tmp4 = mul i4 %tmp3, %x 158 %tmp5 = mul i4 %tmp4, %x 159 %tmp6 = mul i4 %tmp5, %x 160 %tmp7 = mul i4 %tmp6, %x 161 %tmp8 = mul i4 %tmp7, %x 162 ret i4 %tmp8 163} 164 165define i4 @foo4x10(i4 %x) { 166; Can be done with three multiplies. 167; CHECK-LABEL: define i4 @foo4x10( 168; CHECK-SAME: i4 [[X:%.*]]) { 169; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]] 170; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP1]], [[TMP1]] 171; CHECK-NEXT: [[TMP2:%.*]] = mul i4 [[TMP4]], [[X]] 172; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP2]], [[TMP2]] 173; CHECK-NEXT: ret i4 [[TMP3]] 174; 175 %tmp1 = mul i4 %x, %x 176 %tmp2 = mul i4 %tmp1, %x 177 %tmp3 = mul i4 %tmp2, %x 178 %tmp4 = mul i4 %tmp3, %x 179 %tmp5 = mul i4 %tmp4, %x 180 %tmp6 = mul i4 %tmp5, %x 181 %tmp7 = mul i4 %tmp6, %x 182 %tmp8 = mul i4 %tmp7, %x 183 %tmp9 = mul i4 %tmp8, %x 184 ret i4 %tmp9 185} 186 187define i4 @foo4x11(i4 %x) { 188; Can be done with four multiplies. 189; CHECK-LABEL: define i4 @foo4x11( 190; CHECK-SAME: i4 [[X:%.*]]) { 191; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]] 192; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP1]], [[TMP1]] 193; CHECK-NEXT: [[TMP2:%.*]] = mul i4 [[TMP4]], [[X]] 194; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP2]], [[X]] 195; CHECK-NEXT: [[TMP10:%.*]] = mul i4 [[TMP3]], [[TMP2]] 196; CHECK-NEXT: ret i4 [[TMP10]] 197; 198 %tmp1 = mul i4 %x, %x 199 %tmp2 = mul i4 %tmp1, %x 200 %tmp3 = mul i4 %tmp2, %x 201 %tmp4 = mul i4 %tmp3, %x 202 %tmp5 = mul i4 %tmp4, %x 203 %tmp6 = mul i4 %tmp5, %x 204 %tmp7 = mul i4 %tmp6, %x 205 %tmp8 = mul i4 %tmp7, %x 206 %tmp9 = mul i4 %tmp8, %x 207 %tmp10 = mul i4 %tmp9, %x 208 ret i4 %tmp10 209} 210 211define i4 @foo4x12(i4 %x) { 212; Can be done with two multiplies. 213; CHECK-LABEL: define i4 @foo4x12( 214; CHECK-SAME: i4 [[X:%.*]]) { 215; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]] 216; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP1]], [[X]] 217; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP4]], [[TMP4]] 218; CHECK-NEXT: [[TMP2:%.*]] = mul i4 [[TMP3]], [[TMP3]] 219; CHECK-NEXT: ret i4 [[TMP2]] 220; 221 %tmp1 = mul i4 %x, %x 222 %tmp2 = mul i4 %tmp1, %x 223 %tmp3 = mul i4 %tmp2, %x 224 %tmp4 = mul i4 %tmp3, %x 225 %tmp5 = mul i4 %tmp4, %x 226 %tmp6 = mul i4 %tmp5, %x 227 %tmp7 = mul i4 %tmp6, %x 228 %tmp8 = mul i4 %tmp7, %x 229 %tmp9 = mul i4 %tmp8, %x 230 %tmp10 = mul i4 %tmp9, %x 231 %tmp11 = mul i4 %tmp10, %x 232 ret i4 %tmp11 233} 234 235define i4 @foo4x13(i4 %x) { 236; Can be done with three multiplies. 237; CHECK-LABEL: define i4 @foo4x13( 238; CHECK-SAME: i4 [[X:%.*]]) { 239; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]] 240; CHECK-NEXT: [[TMP2:%.*]] = mul i4 [[TMP1]], [[X]] 241; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP2]], [[TMP2]] 242; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP3]], [[X]] 243; CHECK-NEXT: [[TMP12:%.*]] = mul i4 [[TMP4]], [[TMP3]] 244; CHECK-NEXT: ret i4 [[TMP12]] 245; 246 %tmp1 = mul i4 %x, %x 247 %tmp2 = mul i4 %tmp1, %x 248 %tmp3 = mul i4 %tmp2, %x 249 %tmp4 = mul i4 %tmp3, %x 250 %tmp5 = mul i4 %tmp4, %x 251 %tmp6 = mul i4 %tmp5, %x 252 %tmp7 = mul i4 %tmp6, %x 253 %tmp8 = mul i4 %tmp7, %x 254 %tmp9 = mul i4 %tmp8, %x 255 %tmp10 = mul i4 %tmp9, %x 256 %tmp11 = mul i4 %tmp10, %x 257 %tmp12 = mul i4 %tmp11, %x 258 ret i4 %tmp12 259} 260 261define i4 @foo4x14(i4 %x) { 262; Can be done with three multiplies. 263; CHECK-LABEL: define i4 @foo4x14( 264; CHECK-SAME: i4 [[X:%.*]]) { 265; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]] 266; CHECK-NEXT: [[TMP6:%.*]] = mul i4 [[TMP1]], [[X]] 267; CHECK-NEXT: [[TMP7:%.*]] = mul i4 [[TMP6]], [[TMP6]] 268; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP7]], [[X]] 269; CHECK-NEXT: [[TMP5:%.*]] = mul i4 [[TMP4]], [[TMP4]] 270; CHECK-NEXT: ret i4 [[TMP5]] 271; 272 %tmp1 = mul i4 %x, %x 273 %tmp2 = mul i4 %tmp1, %x 274 %tmp3 = mul i4 %tmp2, %x 275 %tmp4 = mul i4 %tmp3, %x 276 %tmp5 = mul i4 %tmp4, %x 277 %tmp6 = mul i4 %tmp5, %x 278 %tmp7 = mul i4 %tmp6, %x 279 %tmp8 = mul i4 %tmp7, %x 280 %tmp9 = mul i4 %tmp8, %x 281 %tmp10 = mul i4 %tmp9, %x 282 %tmp11 = mul i4 %tmp10, %x 283 %tmp12 = mul i4 %tmp11, %x 284 %tmp13 = mul i4 %tmp12, %x 285 ret i4 %tmp13 286} 287 288define i4 @foo4x15(i4 %x) { 289; Can be done with four multiplies. 290; CHECK-LABEL: define i4 @foo4x15( 291; CHECK-SAME: i4 [[X:%.*]]) { 292; CHECK-NEXT: [[TMP1:%.*]] = mul i4 [[X]], [[X]] 293; CHECK-NEXT: [[TMP6:%.*]] = mul i4 [[TMP1]], [[X]] 294; CHECK-NEXT: [[TMP3:%.*]] = mul i4 [[TMP6]], [[TMP6]] 295; CHECK-NEXT: [[TMP4:%.*]] = mul i4 [[TMP3]], [[X]] 296; CHECK-NEXT: [[TMP5:%.*]] = mul i4 [[TMP4]], [[X]] 297; CHECK-NEXT: [[TMP14:%.*]] = mul i4 [[TMP5]], [[TMP4]] 298; CHECK-NEXT: ret i4 [[TMP14]] 299; 300 %tmp1 = mul i4 %x, %x 301 %tmp2 = mul i4 %tmp1, %x 302 %tmp3 = mul i4 %tmp2, %x 303 %tmp4 = mul i4 %tmp3, %x 304 %tmp5 = mul i4 %tmp4, %x 305 %tmp6 = mul i4 %tmp5, %x 306 %tmp7 = mul i4 %tmp6, %x 307 %tmp8 = mul i4 %tmp7, %x 308 %tmp9 = mul i4 %tmp8, %x 309 %tmp10 = mul i4 %tmp9, %x 310 %tmp11 = mul i4 %tmp10, %x 311 %tmp12 = mul i4 %tmp11, %x 312 %tmp13 = mul i4 %tmp12, %x 313 %tmp14 = mul i4 %tmp13, %x 314 ret i4 %tmp14 315} 316