1; RUN: opt < %s -cost-model -analyze -mtriple=systemz-unknown -mcpu=z13 \ 2; RUN: | FileCheck %s -check-prefixes=CHECK,Z13 3; RUN: opt < %s -cost-model -analyze -mtriple=systemz-unknown -mcpu=z14 \ 4; RUN: | FileCheck %s -check-prefixes=CHECK,Z14 5; 6; Test that loads into operations that can fold one memory operand get zero 7; cost. In the case that both operands are loaded, one load should get a cost 8; value. 9 10define void @add() { 11 %li32 = load i32, i32* undef 12 add i32 %li32, undef 13 14 %li32_0 = load i32, i32* undef 15 %li32_1 = load i32, i32* undef 16 add i32 %li32_0, %li32_1 17 18 %li64 = load i64, i64* undef 19 add i64 %li64, undef 20 21 %li64_0 = load i64, i64* undef 22 %li64_1 = load i64, i64* undef 23 add i64 %li64_0, %li64_1 24 25 ; Truncated load 26 %li64_2 = load i64, i64* undef 27 %tr = trunc i64 %li64_2 to i32 28 add i32 %tr, undef 29 30 ; Sign-extended loads 31 %li16_0 = load i16, i16* undef 32 %sext_0 = sext i16 %li16_0 to i32 33 add i32 %sext_0, undef 34 35 %li16_1 = load i16, i16* undef 36 %sext_1 = sext i16 %li16_1 to i64 37 add i64 %sext_1, undef 38 39 %li32_2 = load i32, i32* undef 40 %sext_2 = sext i32 %li32_2 to i64 41 add i64 %sext_2, undef 42 43 ; Zero-extended loads 44 %li32_3 = load i32, i32* undef 45 %zext_0 = zext i32 %li32_3 to i64 46 add i64 %zext_0, undef 47 48 ; Loads with multiple uses are *not* folded 49 %li16_3 = load i16, i16* undef 50 %sext_3 = sext i16 %li16_3 to i32 51 %sext_4 = sext i16 %li16_3 to i32 52 add i32 %sext_3, undef 53 54 ret void; 55 56; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, i32* undef 57; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = add i32 %li32, undef 58; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_0 = load i32, i32* undef 59; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_1 = load i32, i32* undef 60; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = add i32 %li32_0, %li32_1 61; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, i64* undef 62; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = add i64 %li64, undef 63; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_0 = load i64, i64* undef 64; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_1 = load i64, i64* undef 65; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = add i64 %li64_0, %li64_1 66; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, i64* undef 67; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i64 %li64_2 to i32 68; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = add i32 %tr, undef 69; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li16_0 = load i16, i16* undef 70; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_0 = sext i16 %li16_0 to i32 71; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = add i32 %sext_0, undef 72; Z13: Cost Model: Found an estimated cost of 1 for instruction: %li16_1 = load i16, i16* undef 73; Z14: Cost Model: Found an estimated cost of 0 for instruction: %li16_1 = load i16, i16* undef 74; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_1 = sext i16 %li16_1 to i64 75; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %7 = add i64 %sext_1, undef 76; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_2 = load i32, i32* undef 77; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_2 = sext i32 %li32_2 to i64 78; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %8 = add i64 %sext_2, undef 79; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_3 = load i32, i32* undef 80; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %zext_0 = zext i32 %li32_3 to i64 81; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %9 = add i64 %zext_0, undef 82; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_3 = load i16, i16* undef 83; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_3 = sext i16 %li16_3 to i32 84; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_4 = sext i16 %li16_3 to i32 85; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %10 = add i32 %sext_3, undef 86} 87 88define void @add_i16_mem16(i16 %Arg, i16* %Src1, i16* %Src2, i16* %Dst, i32* %Src32) { 89 %L1 = load i16, i16* %Src1 90 %S0 = add i16 %L1, %Arg 91 store volatile i16 %S0, i16* %Dst 92 93 %L2 = load i16, i16* %Src1 94 %L3 = load i16, i16* %Src2 95 %S1 = add i16 %L2, %L3 96 store volatile i16 %S1, i16* %Dst 97 98 ; Truncated load 99 %L32 = load i32, i32* %Src32 100 %tr = trunc i32 %L32 to i16 101 %S2 = add i16 %tr, %Arg 102 store volatile i16 %S2, i16* %Dst 103 104 ret void 105; CHECK: Printing analysis 'Cost Model Analysis' for function 'add_i16_mem16': 106; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L1 = load i16, i16* %Src1 107; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %S0 = add i16 %L1, %Arg 108; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %S0, i16* %Dst 109; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L2 = load i16, i16* %Src1 110; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %L3 = load i16, i16* %Src2 111; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %S1 = add i16 %L2, %L3 112; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %S1, i16* %Dst 113; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L32 = load i32, i32* %Src32 114; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i32 %L32 to i16 115; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %S2 = add i16 %tr, %Arg 116; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %S2, i16* %Dst 117} 118 119define void @sub_lhs_mem() { 120 %li32 = load i32, i32* undef 121 sub i32 %li32, undef 122 123 %li32_0 = load i32, i32* undef 124 %li32_1 = load i32, i32* undef 125 sub i32 %li32_0, %li32_1 126 127 %li64 = load i64, i64* undef 128 sub i64 %li64, undef 129 130 %li64_0 = load i64, i64* undef 131 %li64_1 = load i64, i64* undef 132 sub i64 %li64_0, %li64_1 133 134 ; Truncated load 135 %li64_2 = load i64, i64* undef 136 %tr = trunc i64 %li64_2 to i32 137 sub i32 %tr, undef 138 139 ; Sign-extended loads 140 %li16_0 = load i16, i16* undef 141 %sext_0 = sext i16 %li16_0 to i32 142 sub i32 %sext_0, undef 143 144 %li16_1 = load i16, i16* undef 145 %sext_1 = sext i16 %li16_1 to i64 146 sub i64 %sext_1, undef 147 148 %li32_2 = load i32, i32* undef 149 %sext_2 = sext i32 %li32_2 to i64 150 sub i64 %sext_2, undef 151 152 ; Zero-extended loads 153 %li32_3 = load i32, i32* undef 154 %zext_0 = zext i32 %li32_3 to i64 155 sub i64 %zext_0, undef 156 157 ; Loads with multiple uses are *not* folded 158 %li16_3 = load i16, i16* undef 159 %sext_3 = sext i16 %li16_3 to i32 160 %sext_4 = sext i16 %li16_3 to i32 161 sub i32 %sext_3, undef 162 163 ret void; 164 165; A sub LHS loaded operand is *not* foldable. 166; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32 = load i32, i32* undef 167; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = sub i32 %li32, undef 168; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_0 = load i32, i32* undef 169; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_1 = load i32, i32* undef 170; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = sub i32 %li32_0, %li32_1 171; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64 = load i64, i64* undef 172; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = sub i64 %li64, undef 173; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_0 = load i64, i64* undef 174; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_1 = load i64, i64* undef 175; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = sub i64 %li64_0, %li64_1 176; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_2 = load i64, i64* undef 177; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i64 %li64_2 to i32 178; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = sub i32 %tr, undef 179; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_0 = load i16, i16* undef 180; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_0 = sext i16 %li16_0 to i32 181; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = sub i32 %sext_0, undef 182; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_1 = load i16, i16* undef 183; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_1 = sext i16 %li16_1 to i64 184; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %7 = sub i64 %sext_1, undef 185; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_2 = load i32, i32* undef 186; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_2 = sext i32 %li32_2 to i64 187; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %8 = sub i64 %sext_2, undef 188; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_3 = load i32, i32* undef 189; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %zext_0 = zext i32 %li32_3 to i64 190; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %9 = sub i64 %zext_0, undef 191; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_3 = load i16, i16* undef 192; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_3 = sext i16 %li16_3 to i32 193; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_4 = sext i16 %li16_3 to i32 194; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %10 = sub i32 %sext_3, undef 195} 196 197define void @sub_rhs_mem() { 198 %li32 = load i32, i32* undef 199 sub i32 undef, %li32 200 201 %li64 = load i64, i64* undef 202 sub i64 undef, %li64 203 204 ; Truncated load 205 %li64_2 = load i64, i64* undef 206 %tr = trunc i64 %li64_2 to i32 207 sub i32 undef, %tr 208 209 ; Sign-extended loads 210 %li16_0 = load i16, i16* undef 211 %sext_0 = sext i16 %li16_0 to i32 212 sub i32 undef, %sext_0 213 214 %li16_1 = load i16, i16* undef 215 %sext_1 = sext i16 %li16_1 to i64 216 sub i64 undef, %sext_1 217 218 %li32_2 = load i32, i32* undef 219 %sext_2 = sext i32 %li32_2 to i64 220 sub i64 undef, %sext_2 221 222 ; Zero-extended loads 223 %li32_3 = load i32, i32* undef 224 %zext_0 = zext i32 %li32_3 to i64 225 sub i64 undef, %zext_0 226 227 ; Loads with multiple uses are *not* folded 228 %li16_3 = load i16, i16* undef 229 %sext_3 = sext i16 %li16_3 to i32 230 %sext_4 = sext i16 %li16_3 to i32 231 sub i32 undef, %sext_3 232 233 ret void; 234 235; A sub RHS loaded operand is foldable. 236; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, i32* undef 237; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = sub i32 undef, %li32 238; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, i64* undef 239; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = sub i64 undef, %li64 240; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, i64* undef 241; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i64 %li64_2 to i32 242; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = sub i32 undef, %tr 243; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li16_0 = load i16, i16* undef 244; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_0 = sext i16 %li16_0 to i32 245; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = sub i32 undef, %sext_0 246; Z13: Cost Model: Found an estimated cost of 1 for instruction: %li16_1 = load i16, i16* undef 247; Z14: Cost Model: Found an estimated cost of 0 for instruction: %li16_1 = load i16, i16* undef 248; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_1 = sext i16 %li16_1 to i64 249; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = sub i64 undef, %sext_1 250; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_2 = load i32, i32* undef 251; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_2 = sext i32 %li32_2 to i64 252; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = sub i64 undef, %sext_2 253; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_3 = load i32, i32* undef 254; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %zext_0 = zext i32 %li32_3 to i64 255; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %7 = sub i64 undef, %zext_0 256; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_3 = load i16, i16* undef 257; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_3 = sext i16 %li16_3 to i32 258; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_4 = sext i16 %li16_3 to i32 259; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %8 = sub i32 undef, %sext_3 260} 261 262define void @sub_i16_mem16(i16 %Arg, i16* %Src1, i16* %Src2, i16* %Dst, i32* %Src32) { 263 %L1 = load i16, i16* %Src1 264 %D0 = sub i16 %Arg, %L1 265 store volatile i16 %D0, i16* %Dst 266 267 %L2 = load i16, i16* %Src1 268 %L3 = load i16, i16* %Src2 269 %D1 = sub i16 %L2, %L3 270 store volatile i16 %D1, i16* %Dst 271 272 ; Truncated load 273 %L32 = load i32, i32* %Src32 274 %tr = trunc i32 %L32 to i16 275 %D2 = sub i16 %Arg, %tr 276 store volatile i16 %D2, i16* %Dst 277 278 ret void 279; CHECK: Printing analysis 'Cost Model Analysis' for function 'sub_i16_mem16': 280; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L1 = load i16, i16* %Src1 281; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %D0 = sub i16 %Arg, %L1 282; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %D0, i16* %Dst 283; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %L2 = load i16, i16* %Src1 284; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L3 = load i16, i16* %Src2 285; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %D1 = sub i16 %L2, %L3 286; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %D1, i16* %Dst 287; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L32 = load i32, i32* %Src32 288; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i32 %L32 to i16 289; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %D2 = sub i16 %Arg, %tr 290; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %D2, i16* %Dst 291} 292 293define void @mul() { 294 %li32 = load i32, i32* undef 295 mul i32 %li32, undef 296 297 %li32_0 = load i32, i32* undef 298 %li32_1 = load i32, i32* undef 299 mul i32 %li32_0, %li32_1 300 301 %li64 = load i64, i64* undef 302 mul i64 %li64, undef 303 304 %li64_0 = load i64, i64* undef 305 %li64_1 = load i64, i64* undef 306 mul i64 %li64_0, %li64_1 307 308 ; Truncated load 309 %li64_2 = load i64, i64* undef 310 %tr = trunc i64 %li64_2 to i32 311 mul i32 %tr, undef 312 313 ; Sign-extended loads 314 %li16_0 = load i16, i16* undef 315 %sext_0 = sext i16 %li16_0 to i32 316 mul i32 %sext_0, undef 317 318 %li16_1 = load i16, i16* undef 319 %sext_1 = sext i16 %li16_1 to i64 320 mul i64 %sext_1, undef 321 322 %li32_2 = load i32, i32* undef 323 %sext_2 = sext i32 %li32_2 to i64 324 mul i64 %sext_2, undef 325 326 ; Zero-extended loads are *not* folded 327 %li16_2 = load i16, i16* undef 328 %zext_0 = zext i16 %li16_2 to i32 329 mul i32 %zext_0, undef 330 331 ; Loads with multiple uses are *not* folded 332 %li16_3 = load i16, i16* undef 333 %sext_3 = sext i16 %li16_3 to i32 334 %sext_4 = sext i16 %li16_3 to i32 335 mul i32 %sext_3, undef 336 337 ret void; 338; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, i32* undef 339; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = mul i32 %li32, undef 340; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_0 = load i32, i32* undef 341; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_1 = load i32, i32* undef 342; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = mul i32 %li32_0, %li32_1 343; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, i64* undef 344; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = mul i64 %li64, undef 345; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_0 = load i64, i64* undef 346; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_1 = load i64, i64* undef 347; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = mul i64 %li64_0, %li64_1 348; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, i64* undef 349; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i64 %li64_2 to i32 350; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = mul i32 %tr, undef 351; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li16_0 = load i16, i16* undef 352; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_0 = sext i16 %li16_0 to i32 353; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = mul i32 %sext_0, undef 354; Z13: Cost Model: Found an estimated cost of 1 for instruction: %li16_1 = load i16, i16* undef 355; Z14: Cost Model: Found an estimated cost of 0 for instruction: %li16_1 = load i16, i16* undef 356; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_1 = sext i16 %li16_1 to i64 357; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %7 = mul i64 %sext_1, undef 358; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_2 = load i32, i32* undef 359; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_2 = sext i32 %li32_2 to i64 360; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %8 = mul i64 %sext_2, undef 361; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_2 = load i16, i16* undef 362; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %zext_0 = zext i16 %li16_2 to i32 363; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %9 = mul i32 %zext_0, undef 364; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li16_3 = load i16, i16* undef 365; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_3 = sext i16 %li16_3 to i32 366; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_4 = sext i16 %li16_3 to i32 367; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %10 = mul i32 %sext_3, undef 368} 369 370define void @mul_i16_mem16(i16 %Arg, i16* %Src1, i16* %Src2, i16* %Dst, i32* %Src32) { 371 %L1 = load i16, i16* %Src1 372 %P0 = mul i16 %Arg, %L1 373 store volatile i16 %P0, i16* %Dst 374 375 %L2 = load i16, i16* %Src1 376 %L3 = load i16, i16* %Src2 377 %P1 = mul i16 %L2, %L3 378 store volatile i16 %P1, i16* %Dst 379 380 ; Truncated load 381 %L32 = load i32, i32* %Src32 382 %tr = trunc i32 %L32 to i16 383 %P2 = mul i16 %Arg, %tr 384 store volatile i16 %P2, i16* %Dst 385 386 ret void 387; CHECK: Printing analysis 'Cost Model Analysis' for function 'mul_i16_mem16': 388; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L1 = load i16, i16* %Src1 389; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %P0 = mul i16 %Arg, %L1 390; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %P0, i16* %Dst 391; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L2 = load i16, i16* %Src1 392; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %L3 = load i16, i16* %Src2 393; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %P1 = mul i16 %L2, %L3 394; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %P1, i16* %Dst 395; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %L32 = load i32, i32* %Src32 396; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i32 %L32 to i16 397; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %P2 = mul i16 %Arg, %tr 398; CHECK: Cost Model: Found an estimated cost of 1 for instruction: store volatile i16 %P2, i16* %Dst 399} 400 401define void @sdiv_lhs(i32 %arg32, i64 %arg64) { 402 %li32 = load i32, i32* undef 403 sdiv i32 %li32, %arg32 404 405 %li32_0 = load i32, i32* undef 406 %li32_1 = load i32, i32* undef 407 sdiv i32 %li32_0, %li32_1 408 409 %li64 = load i64, i64* undef 410 sdiv i64 %li64, %arg64 411 412 %li64_0 = load i64, i64* undef 413 %li64_1 = load i64, i64* undef 414 sdiv i64 %li64_0, %li64_1 415 416 ; Truncated load 417 %li64_2 = load i64, i64* undef 418 %tr = trunc i64 %li64_2 to i32 419 sdiv i32 %tr, undef 420 421 ; Sign-extended loads 422 %li32_2 = load i32, i32* undef 423 %sext_0 = sext i32 %li32_2 to i64 424 sdiv i64 %sext_0, undef 425 426 ; Loads with multiple uses are *not* folded 427 %li32_3 = load i32, i32* undef 428 %sext_1 = sext i32 %li32_3 to i64 429 %sext_2 = sext i32 %li32_3 to i64 430 sdiv i64 %sext_1, undef 431 432 ret void; 433 434; An sdiv loaded dividend (lhs) operand is *not* foldable. 435; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32 = load i32, i32* undef 436; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %1 = sdiv i32 %li32, %arg32 437; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_0 = load i32, i32* undef 438; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_1 = load i32, i32* undef 439; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %2 = sdiv i32 %li32_0, %li32_1 440; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64 = load i64, i64* undef 441; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %3 = sdiv i64 %li64, %arg64 442; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_0 = load i64, i64* undef 443; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_1 = load i64, i64* undef 444; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %4 = sdiv i64 %li64_0, %li64_1 445; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_2 = load i64, i64* undef 446; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i64 %li64_2 to i32 447; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %5 = sdiv i32 %tr, undef 448; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_2 = load i32, i32* undef 449; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_0 = sext i32 %li32_2 to i64 450; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %6 = sdiv i64 %sext_0, undef 451; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_3 = load i32, i32* undef 452; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_1 = sext i32 %li32_3 to i64 453; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_2 = sext i32 %li32_3 to i64 454; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %7 = sdiv i64 %sext_1, undef 455} 456 457define void @sdiv_rhs(i32 %arg32, i64 %arg64) { 458 %li32 = load i32, i32* undef 459 sdiv i32 %arg32, %li32 460 461 %li64 = load i64, i64* undef 462 sdiv i64 %arg64, %li64 463 464 ; Truncated load 465 %li64_2 = load i64, i64* undef 466 %tr = trunc i64 %li64_2 to i32 467 sdiv i32 undef, %tr 468 469 ; Sign-extended loads 470 %li32_2 = load i32, i32* undef 471 %sext_0 = sext i32 %li32_2 to i64 472 sdiv i64 undef, %sext_0 473 474 ; Loads with multiple uses are *not* folded 475 %li32_3 = load i32, i32* undef 476 %sext_1 = sext i32 %li32_3 to i64 477 %sext_2 = sext i32 %li32_3 to i64 478 sdiv i64 undef, %sext_1 479 480 ret void; 481 482; An sdiv loaded divisor (rhs) operand is foldable. 483; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, i32* undef 484; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %1 = sdiv i32 %arg32, %li32 485; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, i64* undef 486; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %2 = sdiv i64 %arg64, %li64 487; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, i64* undef 488; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr = trunc i64 %li64_2 to i32 489; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %3 = sdiv i32 undef, %tr 490; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_2 = load i32, i32* undef 491; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_0 = sext i32 %li32_2 to i64 492; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %4 = sdiv i64 undef, %sext_0 493; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_3 = load i32, i32* undef 494; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_1 = sext i32 %li32_3 to i64 495; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext_2 = sext i32 %li32_3 to i64 496; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %5 = sdiv i64 undef, %sext_1 497} 498 499define void @udiv_lhs(i32 %arg32, i64 %arg64) { 500 %li32 = load i32, i32* undef 501 udiv i32 %li32, %arg32 502 503 %li32_0 = load i32, i32* undef 504 %li32_1 = load i32, i32* undef 505 udiv i32 %li32_0, %li32_1 506 507 %li64 = load i64, i64* undef 508 udiv i64 %li64, %arg64 509 510 %li64_0 = load i64, i64* undef 511 %li64_1 = load i64, i64* undef 512 udiv i64 %li64_0, %li64_1 513 514 ; Truncated load 515 %li64_2 = load i64, i64* undef 516 %tr_0 = trunc i64 %li64_2 to i32 517 udiv i32 %tr_0, undef 518 519 ; Loads with multiple uses are *not* folded 520 %li64_3 = load i64, i64* undef 521 %tr_1 = trunc i64 %li64_3 to i32 522 udiv i64 %li64_3, undef 523 524 ret void; 525 526; An udiv loaded dividend (lhs) operand is *not* foldable. 527; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32 = load i32, i32* undef 528; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %1 = udiv i32 %li32, %arg32 529; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_0 = load i32, i32* undef 530; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_1 = load i32, i32* undef 531; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %2 = udiv i32 %li32_0, %li32_1 532; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64 = load i64, i64* undef 533; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %3 = udiv i64 %li64, %arg64 534; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_0 = load i64, i64* undef 535; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_1 = load i64, i64* undef 536; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %4 = udiv i64 %li64_0, %li64_1 537; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_2 = load i64, i64* undef 538; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_0 = trunc i64 %li64_2 to i32 539; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %5 = udiv i32 %tr_0, undef 540; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_3 = load i64, i64* undef 541; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_1 = trunc i64 %li64_3 to i32 542; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %6 = udiv i64 %li64_3, undef 543} 544 545define void @udiv_rhs(i32 %arg32, i64 %arg64) { 546 %li32 = load i32, i32* undef 547 udiv i32 %arg32, %li32 548 549 %li64 = load i64, i64* undef 550 udiv i64 %arg64, %li64 551 552 ; Truncated load 553 %li64_2 = load i64, i64* undef 554 %tr_0 = trunc i64 %li64_2 to i32 555 udiv i32 undef, %tr_0 556 557 ; Loads with multiple uses are *not* folded 558 %li64_3 = load i64, i64* undef 559 %tr_1 = trunc i64 %li64_3 to i32 560 udiv i64 undef, %li64_3 561 562 ret void; 563 564; An udiv loaded divisor (rhs) operand is foldable. 565; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, i32* undef 566; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %1 = udiv i32 %arg32, %li32 567; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, i64* undef 568; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %2 = udiv i64 %arg64, %li64 569; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, i64* undef 570; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_0 = trunc i64 %li64_2 to i32 571; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %3 = udiv i32 undef, %tr_0 572; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_3 = load i64, i64* undef 573; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_1 = trunc i64 %li64_3 to i32 574; CHECK: Cost Model: Found an estimated cost of 20 for instruction: %4 = udiv i64 undef, %li64_3 575} 576 577define void @and() { 578 %li32 = load i32, i32* undef 579 and i32 %li32, undef 580 581 %li32_0 = load i32, i32* undef 582 %li32_1 = load i32, i32* undef 583 and i32 %li32_0, %li32_1 584 585 %li64 = load i64, i64* undef 586 and i64 %li64, undef 587 588 %li64_0 = load i64, i64* undef 589 %li64_1 = load i64, i64* undef 590 and i64 %li64_0, %li64_1 591 592 ; Truncated load 593 %li64_2 = load i64, i64* undef 594 %tr_0 = trunc i64 %li64_2 to i32 595 and i32 %tr_0, undef 596 597 ; Loads with multiple uses are *not* folded 598 %li64_3 = load i64, i64* undef 599 %tr_1 = trunc i64 %li64_3 to i32 600 and i64 %li64_3, undef 601 602 ret void; 603; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, i32* undef 604; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = and i32 %li32, undef 605; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_0 = load i32, i32* undef 606; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_1 = load i32, i32* undef 607; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = and i32 %li32_0, %li32_1 608; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, i64* undef 609; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = and i64 %li64, undef 610; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_0 = load i64, i64* undef 611; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_1 = load i64, i64* undef 612; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = and i64 %li64_0, %li64_1 613; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, i64* undef 614; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_0 = trunc i64 %li64_2 to i32 615; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = and i32 %tr_0, undef 616; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_3 = load i64, i64* undef 617; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_1 = trunc i64 %li64_3 to i32 618; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = and i64 %li64_3, undef 619} 620 621define void @or() { 622 %li32 = load i32, i32* undef 623 or i32 %li32, undef 624 625 %li32_0 = load i32, i32* undef 626 %li32_1 = load i32, i32* undef 627 or i32 %li32_0, %li32_1 628 629 %li64 = load i64, i64* undef 630 or i64 %li64, undef 631 632 %li64_0 = load i64, i64* undef 633 %li64_1 = load i64, i64* undef 634 or i64 %li64_0, %li64_1 635 636 ; Truncated load 637 %li64_2 = load i64, i64* undef 638 %tr_0 = trunc i64 %li64_2 to i32 639 or i32 %tr_0, undef 640 641 ; Loads with multiple uses are *not* folded 642 %li64_3 = load i64, i64* undef 643 %tr_1 = trunc i64 %li64_3 to i32 644 or i64 %li64_3, undef 645 646 ret void; 647; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, i32* undef 648; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = or i32 %li32, undef 649; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_0 = load i32, i32* undef 650; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_1 = load i32, i32* undef 651; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = or i32 %li32_0, %li32_1 652; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, i64* undef 653; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = or i64 %li64, undef 654; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_0 = load i64, i64* undef 655; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_1 = load i64, i64* undef 656; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = or i64 %li64_0, %li64_1 657; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, i64* undef 658; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_0 = trunc i64 %li64_2 to i32 659; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = or i32 %tr_0, undef 660; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_3 = load i64, i64* undef 661; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_1 = trunc i64 %li64_3 to i32 662; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = or i64 %li64_3, undef 663} 664 665define void @xor() { 666 %li32 = load i32, i32* undef 667 xor i32 %li32, undef 668 669 %li32_0 = load i32, i32* undef 670 %li32_1 = load i32, i32* undef 671 xor i32 %li32_0, %li32_1 672 673 %li64 = load i64, i64* undef 674 xor i64 %li64, undef 675 676 %li64_0 = load i64, i64* undef 677 %li64_1 = load i64, i64* undef 678 xor i64 %li64_0, %li64_1 679 680 ; Truncated load 681 %li64_2 = load i64, i64* undef 682 %tr_0 = trunc i64 %li64_2 to i32 683 xor i32 %tr_0, undef 684 685 ; Loads with multiple uses are *not* folded 686 %li64_3 = load i64, i64* undef 687 %tr_1 = trunc i64 %li64_3 to i32 688 xor i64 %li64_3, undef 689 690 ret void; 691; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, i32* undef 692; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = xor i32 %li32, undef 693; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_0 = load i32, i32* undef 694; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_1 = load i32, i32* undef 695; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = xor i32 %li32_0, %li32_1 696; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, i64* undef 697; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = xor i64 %li64, undef 698; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_0 = load i64, i64* undef 699; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_1 = load i64, i64* undef 700; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = xor i64 %li64_0, %li64_1 701; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, i64* undef 702; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_0 = trunc i64 %li64_2 to i32 703; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = xor i32 %tr_0, undef 704; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_3 = load i64, i64* undef 705; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_1 = trunc i64 %li64_3 to i32 706; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = xor i64 %li64_3, undef 707} 708 709define void @icmp() { 710 %li32 = load i32, i32* undef 711 icmp eq i32 %li32, undef 712 713 %li32_0 = load i32, i32* undef 714 %li32_1 = load i32, i32* undef 715 icmp eq i32 %li32_0, %li32_1 716 717 %li64 = load i64, i64* undef 718 icmp eq i64 %li64, undef 719 720 %li64_0 = load i64, i64* undef 721 %li64_1 = load i64, i64* undef 722 icmp eq i64 %li64_0, %li64_1 723 724 ; Truncated load 725 %li64_2 = load i64, i64* undef 726 %tr_0 = trunc i64 %li64_2 to i32 727 icmp eq i32 %tr_0, undef 728 729 ; Sign-extended load 730 %li32_2 = load i32, i32* undef 731 %sext = sext i32 %li32_2 to i64 732 icmp eq i64 %sext, undef 733 734 ; Zero-extended load 735 %li32_3 = load i32, i32* undef 736 %zext = zext i32 %li32_3 to i64 737 icmp eq i64 %zext, undef 738 739 ; Loads with multiple uses are *not* folded 740 %li64_3 = load i64, i64* undef 741 %tr_1 = trunc i64 %li64_3 to i32 742 icmp eq i64 %li64_3, undef 743 744 ret void; 745; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32 = load i32, i32* undef 746; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %1 = icmp eq i32 %li32, undef 747; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_0 = load i32, i32* undef 748; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li32_1 = load i32, i32* undef 749; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %2 = icmp eq i32 %li32_0, %li32_1 750; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64 = load i64, i64* undef 751; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %3 = icmp eq i64 %li64, undef 752; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_0 = load i64, i64* undef 753; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_1 = load i64, i64* undef 754; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %4 = icmp eq i64 %li64_0, %li64_1 755; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li64_2 = load i64, i64* undef 756; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_0 = trunc i64 %li64_2 to i32 757; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %5 = icmp eq i32 %tr_0, undef 758; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_2 = load i32, i32* undef 759; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %sext = sext i32 %li32_2 to i64 760; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %6 = icmp eq i64 %sext, undef 761; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %li32_3 = load i32, i32* undef 762; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %zext = zext i32 %li32_3 to i64 763; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %7 = icmp eq i64 %zext, undef 764; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %li64_3 = load i64, i64* undef 765; CHECK: Cost Model: Found an estimated cost of 0 for instruction: %tr_1 = trunc i64 %li64_3 to i32 766; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %8 = icmp eq i64 %li64_3, undef 767} 768