1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s --check-prefix=X86 3; RUN: llc < %s -mtriple=x86_64-unknown -print-schedule=true -mcpu=haswell| FileCheck %s --check-prefix=X64-HSW 4; RUN: llc < %s -mtriple=x86_64-unknown -print-schedule=true -mcpu=btver2| FileCheck %s --check-prefix=X64-JAG 5; RUN: llc < %s -mtriple=i686-unknown -mul-constant-optimization=false | FileCheck %s --check-prefix=X86-NOOPT 6; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -print-schedule=true -mcpu=haswell| FileCheck %s --check-prefix=HSW-NOOPT 7; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -print-schedule=true -mcpu=btver2| FileCheck %s --check-prefix=JAG-NOOPT 8; RUN: llc < %s -mtriple=x86_64-unknown -print-schedule=true -mcpu=slm| FileCheck %s --check-prefix=X64-SLM 9; RUN: llc < %s -mtriple=x86_64-unknown -mul-constant-optimization=false -print-schedule=true -mcpu=slm| FileCheck %s --check-prefix=SLM-NOOPT 10 11define i32 @test_mul_by_1(i32 %x) { 12; X86-LABEL: test_mul_by_1: 13; X86: # %bb.0: 14; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 15; X86-NEXT: retl 16; 17; X64-HSW-LABEL: test_mul_by_1: 18; X64-HSW: # %bb.0: 19; X64-HSW-NEXT: movl %edi, %eax # sched: [1:0.25] 20; X64-HSW-NEXT: retq # sched: [7:1.00] 21; 22; X64-JAG-LABEL: test_mul_by_1: 23; X64-JAG: # %bb.0: 24; X64-JAG-NEXT: movl %edi, %eax # sched: [1:0.50] 25; X64-JAG-NEXT: retq # sched: [4:1.00] 26; 27; X86-NOOPT-LABEL: test_mul_by_1: 28; X86-NOOPT: # %bb.0: 29; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax 30; X86-NOOPT-NEXT: retl 31; 32; HSW-NOOPT-LABEL: test_mul_by_1: 33; HSW-NOOPT: # %bb.0: 34; HSW-NOOPT-NEXT: movl %edi, %eax # sched: [1:0.25] 35; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 36; 37; JAG-NOOPT-LABEL: test_mul_by_1: 38; JAG-NOOPT: # %bb.0: 39; JAG-NOOPT-NEXT: movl %edi, %eax # sched: [1:0.50] 40; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 41; 42; X64-SLM-LABEL: test_mul_by_1: 43; X64-SLM: # %bb.0: 44; X64-SLM-NEXT: movl %edi, %eax # sched: [1:0.50] 45; X64-SLM-NEXT: retq # sched: [4:1.00] 46; 47; SLM-NOOPT-LABEL: test_mul_by_1: 48; SLM-NOOPT: # %bb.0: 49; SLM-NOOPT-NEXT: movl %edi, %eax # sched: [1:0.50] 50; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 51 %mul = mul nsw i32 %x, 1 52 ret i32 %mul 53} 54 55define i32 @test_mul_by_2(i32 %x) { 56; X86-LABEL: test_mul_by_2: 57; X86: # %bb.0: 58; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 59; X86-NEXT: addl %eax, %eax 60; X86-NEXT: retl 61; 62; X64-HSW-LABEL: test_mul_by_2: 63; X64-HSW: # %bb.0: 64; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 65; X64-HSW-NEXT: leal (%rdi,%rdi), %eax # sched: [1:0.50] 66; X64-HSW-NEXT: retq # sched: [7:1.00] 67; 68; X64-JAG-LABEL: test_mul_by_2: 69; X64-JAG: # %bb.0: 70; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 71; X64-JAG-NEXT: leal (%rdi,%rdi), %eax # sched: [1:0.50] 72; X64-JAG-NEXT: retq # sched: [4:1.00] 73; 74; X86-NOOPT-LABEL: test_mul_by_2: 75; X86-NOOPT: # %bb.0: 76; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax 77; X86-NOOPT-NEXT: addl %eax, %eax 78; X86-NOOPT-NEXT: retl 79; 80; HSW-NOOPT-LABEL: test_mul_by_2: 81; HSW-NOOPT: # %bb.0: 82; HSW-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 83; HSW-NOOPT-NEXT: leal (%rdi,%rdi), %eax # sched: [1:0.50] 84; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 85; 86; JAG-NOOPT-LABEL: test_mul_by_2: 87; JAG-NOOPT: # %bb.0: 88; JAG-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 89; JAG-NOOPT-NEXT: leal (%rdi,%rdi), %eax # sched: [1:0.50] 90; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 91; 92; X64-SLM-LABEL: test_mul_by_2: 93; X64-SLM: # %bb.0: 94; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 95; X64-SLM-NEXT: leal (%rdi,%rdi), %eax # sched: [1:1.00] 96; X64-SLM-NEXT: retq # sched: [4:1.00] 97; 98; SLM-NOOPT-LABEL: test_mul_by_2: 99; SLM-NOOPT: # %bb.0: 100; SLM-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 101; SLM-NOOPT-NEXT: leal (%rdi,%rdi), %eax # sched: [1:1.00] 102; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 103 %mul = mul nsw i32 %x, 2 104 ret i32 %mul 105} 106 107define i32 @test_mul_by_3(i32 %x) { 108; X86-LABEL: test_mul_by_3: 109; X86: # %bb.0: 110; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 111; X86-NEXT: leal (%eax,%eax,2), %eax 112; X86-NEXT: retl 113; 114; X64-HSW-LABEL: test_mul_by_3: 115; X64-HSW: # %bb.0: 116; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 117; X64-HSW-NEXT: leal (%rdi,%rdi,2), %eax # sched: [1:0.50] 118; X64-HSW-NEXT: retq # sched: [7:1.00] 119; 120; X64-JAG-LABEL: test_mul_by_3: 121; X64-JAG: # %bb.0: 122; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 123; X64-JAG-NEXT: leal (%rdi,%rdi,2), %eax # sched: [2:1.00] 124; X64-JAG-NEXT: retq # sched: [4:1.00] 125; 126; X86-NOOPT-LABEL: test_mul_by_3: 127; X86-NOOPT: # %bb.0: 128; X86-NOOPT-NEXT: imull $3, {{[0-9]+}}(%esp), %eax 129; X86-NOOPT-NEXT: retl 130; 131; HSW-NOOPT-LABEL: test_mul_by_3: 132; HSW-NOOPT: # %bb.0: 133; HSW-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 134; HSW-NOOPT-NEXT: leal (%rdi,%rdi,2), %eax # sched: [1:0.50] 135; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 136; 137; JAG-NOOPT-LABEL: test_mul_by_3: 138; JAG-NOOPT: # %bb.0: 139; JAG-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 140; JAG-NOOPT-NEXT: leal (%rdi,%rdi,2), %eax # sched: [2:1.00] 141; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 142; 143; X64-SLM-LABEL: test_mul_by_3: 144; X64-SLM: # %bb.0: 145; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 146; X64-SLM-NEXT: leal (%rdi,%rdi,2), %eax # sched: [1:1.00] 147; X64-SLM-NEXT: retq # sched: [4:1.00] 148; 149; SLM-NOOPT-LABEL: test_mul_by_3: 150; SLM-NOOPT: # %bb.0: 151; SLM-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 152; SLM-NOOPT-NEXT: leal (%rdi,%rdi,2), %eax # sched: [1:1.00] 153; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 154 %mul = mul nsw i32 %x, 3 155 ret i32 %mul 156} 157 158define i32 @test_mul_by_4(i32 %x) { 159; X86-LABEL: test_mul_by_4: 160; X86: # %bb.0: 161; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 162; X86-NEXT: shll $2, %eax 163; X86-NEXT: retl 164; 165; X64-HSW-LABEL: test_mul_by_4: 166; X64-HSW: # %bb.0: 167; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 168; X64-HSW-NEXT: leal (,%rdi,4), %eax # sched: [1:0.50] 169; X64-HSW-NEXT: retq # sched: [7:1.00] 170; 171; X64-JAG-LABEL: test_mul_by_4: 172; X64-JAG: # %bb.0: 173; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 174; X64-JAG-NEXT: leal (,%rdi,4), %eax # sched: [2:1.00] 175; X64-JAG-NEXT: retq # sched: [4:1.00] 176; 177; X86-NOOPT-LABEL: test_mul_by_4: 178; X86-NOOPT: # %bb.0: 179; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax 180; X86-NOOPT-NEXT: shll $2, %eax 181; X86-NOOPT-NEXT: retl 182; 183; HSW-NOOPT-LABEL: test_mul_by_4: 184; HSW-NOOPT: # %bb.0: 185; HSW-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 186; HSW-NOOPT-NEXT: leal (,%rdi,4), %eax # sched: [1:0.50] 187; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 188; 189; JAG-NOOPT-LABEL: test_mul_by_4: 190; JAG-NOOPT: # %bb.0: 191; JAG-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 192; JAG-NOOPT-NEXT: leal (,%rdi,4), %eax # sched: [2:1.00] 193; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 194; 195; X64-SLM-LABEL: test_mul_by_4: 196; X64-SLM: # %bb.0: 197; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 198; X64-SLM-NEXT: leal (,%rdi,4), %eax # sched: [1:1.00] 199; X64-SLM-NEXT: retq # sched: [4:1.00] 200; 201; SLM-NOOPT-LABEL: test_mul_by_4: 202; SLM-NOOPT: # %bb.0: 203; SLM-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 204; SLM-NOOPT-NEXT: leal (,%rdi,4), %eax # sched: [1:1.00] 205; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 206 %mul = mul nsw i32 %x, 4 207 ret i32 %mul 208} 209 210define i32 @test_mul_by_5(i32 %x) { 211; X86-LABEL: test_mul_by_5: 212; X86: # %bb.0: 213; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 214; X86-NEXT: leal (%eax,%eax,4), %eax 215; X86-NEXT: retl 216; 217; X64-HSW-LABEL: test_mul_by_5: 218; X64-HSW: # %bb.0: 219; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 220; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 221; X64-HSW-NEXT: retq # sched: [7:1.00] 222; 223; X64-JAG-LABEL: test_mul_by_5: 224; X64-JAG: # %bb.0: 225; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 226; X64-JAG-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00] 227; X64-JAG-NEXT: retq # sched: [4:1.00] 228; 229; X86-NOOPT-LABEL: test_mul_by_5: 230; X86-NOOPT: # %bb.0: 231; X86-NOOPT-NEXT: imull $5, {{[0-9]+}}(%esp), %eax 232; X86-NOOPT-NEXT: retl 233; 234; HSW-NOOPT-LABEL: test_mul_by_5: 235; HSW-NOOPT: # %bb.0: 236; HSW-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 237; HSW-NOOPT-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 238; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 239; 240; JAG-NOOPT-LABEL: test_mul_by_5: 241; JAG-NOOPT: # %bb.0: 242; JAG-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 243; JAG-NOOPT-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00] 244; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 245; 246; X64-SLM-LABEL: test_mul_by_5: 247; X64-SLM: # %bb.0: 248; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 249; X64-SLM-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:1.00] 250; X64-SLM-NEXT: retq # sched: [4:1.00] 251; 252; SLM-NOOPT-LABEL: test_mul_by_5: 253; SLM-NOOPT: # %bb.0: 254; SLM-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 255; SLM-NOOPT-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:1.00] 256; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 257 %mul = mul nsw i32 %x, 5 258 ret i32 %mul 259} 260 261define i32 @test_mul_by_6(i32 %x) { 262; X86-LABEL: test_mul_by_6: 263; X86: # %bb.0: 264; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 265; X86-NEXT: addl %eax, %eax 266; X86-NEXT: leal (%eax,%eax,2), %eax 267; X86-NEXT: retl 268; 269; X64-HSW-LABEL: test_mul_by_6: 270; X64-HSW: # %bb.0: 271; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 272; X64-HSW-NEXT: addl %edi, %edi # sched: [1:0.25] 273; X64-HSW-NEXT: leal (%rdi,%rdi,2), %eax # sched: [1:0.50] 274; X64-HSW-NEXT: retq # sched: [7:1.00] 275; 276; X64-JAG-LABEL: test_mul_by_6: 277; X64-JAG: # %bb.0: 278; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 279; X64-JAG-NEXT: addl %edi, %edi # sched: [1:0.50] 280; X64-JAG-NEXT: leal (%rdi,%rdi,2), %eax # sched: [2:1.00] 281; X64-JAG-NEXT: retq # sched: [4:1.00] 282; 283; X86-NOOPT-LABEL: test_mul_by_6: 284; X86-NOOPT: # %bb.0: 285; X86-NOOPT-NEXT: imull $6, {{[0-9]+}}(%esp), %eax 286; X86-NOOPT-NEXT: retl 287; 288; HSW-NOOPT-LABEL: test_mul_by_6: 289; HSW-NOOPT: # %bb.0: 290; HSW-NOOPT-NEXT: imull $6, %edi, %eax # sched: [3:1.00] 291; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 292; 293; JAG-NOOPT-LABEL: test_mul_by_6: 294; JAG-NOOPT: # %bb.0: 295; JAG-NOOPT-NEXT: imull $6, %edi, %eax # sched: [3:1.00] 296; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 297; 298; X64-SLM-LABEL: test_mul_by_6: 299; X64-SLM: # %bb.0: 300; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 301; X64-SLM-NEXT: addl %edi, %edi # sched: [1:0.50] 302; X64-SLM-NEXT: leal (%rdi,%rdi,2), %eax # sched: [1:1.00] 303; X64-SLM-NEXT: retq # sched: [4:1.00] 304; 305; SLM-NOOPT-LABEL: test_mul_by_6: 306; SLM-NOOPT: # %bb.0: 307; SLM-NOOPT-NEXT: imull $6, %edi, %eax # sched: [3:1.00] 308; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 309 %mul = mul nsw i32 %x, 6 310 ret i32 %mul 311} 312 313define i32 @test_mul_by_7(i32 %x) { 314; X86-LABEL: test_mul_by_7: 315; X86: # %bb.0: 316; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 317; X86-NEXT: leal (,%ecx,8), %eax 318; X86-NEXT: subl %ecx, %eax 319; X86-NEXT: retl 320; 321; X64-HSW-LABEL: test_mul_by_7: 322; X64-HSW: # %bb.0: 323; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 324; X64-HSW-NEXT: leal (,%rdi,8), %eax # sched: [1:0.50] 325; X64-HSW-NEXT: subl %edi, %eax # sched: [1:0.25] 326; X64-HSW-NEXT: retq # sched: [7:1.00] 327; 328; X64-JAG-LABEL: test_mul_by_7: 329; X64-JAG: # %bb.0: 330; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 331; X64-JAG-NEXT: leal (,%rdi,8), %eax # sched: [2:1.00] 332; X64-JAG-NEXT: subl %edi, %eax # sched: [1:0.50] 333; X64-JAG-NEXT: retq # sched: [4:1.00] 334; 335; X86-NOOPT-LABEL: test_mul_by_7: 336; X86-NOOPT: # %bb.0: 337; X86-NOOPT-NEXT: imull $7, {{[0-9]+}}(%esp), %eax 338; X86-NOOPT-NEXT: retl 339; 340; HSW-NOOPT-LABEL: test_mul_by_7: 341; HSW-NOOPT: # %bb.0: 342; HSW-NOOPT-NEXT: imull $7, %edi, %eax # sched: [3:1.00] 343; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 344; 345; JAG-NOOPT-LABEL: test_mul_by_7: 346; JAG-NOOPT: # %bb.0: 347; JAG-NOOPT-NEXT: imull $7, %edi, %eax # sched: [3:1.00] 348; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 349; 350; X64-SLM-LABEL: test_mul_by_7: 351; X64-SLM: # %bb.0: 352; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 353; X64-SLM-NEXT: leal (,%rdi,8), %eax # sched: [1:1.00] 354; X64-SLM-NEXT: subl %edi, %eax # sched: [1:0.50] 355; X64-SLM-NEXT: retq # sched: [4:1.00] 356; 357; SLM-NOOPT-LABEL: test_mul_by_7: 358; SLM-NOOPT: # %bb.0: 359; SLM-NOOPT-NEXT: imull $7, %edi, %eax # sched: [3:1.00] 360; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 361 %mul = mul nsw i32 %x, 7 362 ret i32 %mul 363} 364 365define i32 @test_mul_by_8(i32 %x) { 366; X86-LABEL: test_mul_by_8: 367; X86: # %bb.0: 368; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 369; X86-NEXT: shll $3, %eax 370; X86-NEXT: retl 371; 372; X64-HSW-LABEL: test_mul_by_8: 373; X64-HSW: # %bb.0: 374; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 375; X64-HSW-NEXT: leal (,%rdi,8), %eax # sched: [1:0.50] 376; X64-HSW-NEXT: retq # sched: [7:1.00] 377; 378; X64-JAG-LABEL: test_mul_by_8: 379; X64-JAG: # %bb.0: 380; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 381; X64-JAG-NEXT: leal (,%rdi,8), %eax # sched: [2:1.00] 382; X64-JAG-NEXT: retq # sched: [4:1.00] 383; 384; X86-NOOPT-LABEL: test_mul_by_8: 385; X86-NOOPT: # %bb.0: 386; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax 387; X86-NOOPT-NEXT: shll $3, %eax 388; X86-NOOPT-NEXT: retl 389; 390; HSW-NOOPT-LABEL: test_mul_by_8: 391; HSW-NOOPT: # %bb.0: 392; HSW-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 393; HSW-NOOPT-NEXT: leal (,%rdi,8), %eax # sched: [1:0.50] 394; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 395; 396; JAG-NOOPT-LABEL: test_mul_by_8: 397; JAG-NOOPT: # %bb.0: 398; JAG-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 399; JAG-NOOPT-NEXT: leal (,%rdi,8), %eax # sched: [2:1.00] 400; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 401; 402; X64-SLM-LABEL: test_mul_by_8: 403; X64-SLM: # %bb.0: 404; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 405; X64-SLM-NEXT: leal (,%rdi,8), %eax # sched: [1:1.00] 406; X64-SLM-NEXT: retq # sched: [4:1.00] 407; 408; SLM-NOOPT-LABEL: test_mul_by_8: 409; SLM-NOOPT: # %bb.0: 410; SLM-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 411; SLM-NOOPT-NEXT: leal (,%rdi,8), %eax # sched: [1:1.00] 412; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 413 %mul = mul nsw i32 %x, 8 414 ret i32 %mul 415} 416 417define i32 @test_mul_by_9(i32 %x) { 418; X86-LABEL: test_mul_by_9: 419; X86: # %bb.0: 420; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 421; X86-NEXT: leal (%eax,%eax,8), %eax 422; X86-NEXT: retl 423; 424; X64-HSW-LABEL: test_mul_by_9: 425; X64-HSW: # %bb.0: 426; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 427; X64-HSW-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:0.50] 428; X64-HSW-NEXT: retq # sched: [7:1.00] 429; 430; X64-JAG-LABEL: test_mul_by_9: 431; X64-JAG: # %bb.0: 432; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 433; X64-JAG-NEXT: leal (%rdi,%rdi,8), %eax # sched: [2:1.00] 434; X64-JAG-NEXT: retq # sched: [4:1.00] 435; 436; X86-NOOPT-LABEL: test_mul_by_9: 437; X86-NOOPT: # %bb.0: 438; X86-NOOPT-NEXT: imull $9, {{[0-9]+}}(%esp), %eax 439; X86-NOOPT-NEXT: retl 440; 441; HSW-NOOPT-LABEL: test_mul_by_9: 442; HSW-NOOPT: # %bb.0: 443; HSW-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 444; HSW-NOOPT-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:0.50] 445; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 446; 447; JAG-NOOPT-LABEL: test_mul_by_9: 448; JAG-NOOPT: # %bb.0: 449; JAG-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 450; JAG-NOOPT-NEXT: leal (%rdi,%rdi,8), %eax # sched: [2:1.00] 451; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 452; 453; X64-SLM-LABEL: test_mul_by_9: 454; X64-SLM: # %bb.0: 455; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 456; X64-SLM-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:1.00] 457; X64-SLM-NEXT: retq # sched: [4:1.00] 458; 459; SLM-NOOPT-LABEL: test_mul_by_9: 460; SLM-NOOPT: # %bb.0: 461; SLM-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 462; SLM-NOOPT-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:1.00] 463; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 464 %mul = mul nsw i32 %x, 9 465 ret i32 %mul 466} 467 468define i32 @test_mul_by_10(i32 %x) { 469; X86-LABEL: test_mul_by_10: 470; X86: # %bb.0: 471; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 472; X86-NEXT: addl %eax, %eax 473; X86-NEXT: leal (%eax,%eax,4), %eax 474; X86-NEXT: retl 475; 476; X64-HSW-LABEL: test_mul_by_10: 477; X64-HSW: # %bb.0: 478; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 479; X64-HSW-NEXT: addl %edi, %edi # sched: [1:0.25] 480; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 481; X64-HSW-NEXT: retq # sched: [7:1.00] 482; 483; X64-JAG-LABEL: test_mul_by_10: 484; X64-JAG: # %bb.0: 485; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 486; X64-JAG-NEXT: addl %edi, %edi # sched: [1:0.50] 487; X64-JAG-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00] 488; X64-JAG-NEXT: retq # sched: [4:1.00] 489; 490; X86-NOOPT-LABEL: test_mul_by_10: 491; X86-NOOPT: # %bb.0: 492; X86-NOOPT-NEXT: imull $10, {{[0-9]+}}(%esp), %eax 493; X86-NOOPT-NEXT: retl 494; 495; HSW-NOOPT-LABEL: test_mul_by_10: 496; HSW-NOOPT: # %bb.0: 497; HSW-NOOPT-NEXT: imull $10, %edi, %eax # sched: [3:1.00] 498; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 499; 500; JAG-NOOPT-LABEL: test_mul_by_10: 501; JAG-NOOPT: # %bb.0: 502; JAG-NOOPT-NEXT: imull $10, %edi, %eax # sched: [3:1.00] 503; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 504; 505; X64-SLM-LABEL: test_mul_by_10: 506; X64-SLM: # %bb.0: 507; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 508; X64-SLM-NEXT: addl %edi, %edi # sched: [1:0.50] 509; X64-SLM-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:1.00] 510; X64-SLM-NEXT: retq # sched: [4:1.00] 511; 512; SLM-NOOPT-LABEL: test_mul_by_10: 513; SLM-NOOPT: # %bb.0: 514; SLM-NOOPT-NEXT: imull $10, %edi, %eax # sched: [3:1.00] 515; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 516 %mul = mul nsw i32 %x, 10 517 ret i32 %mul 518} 519 520define i32 @test_mul_by_11(i32 %x) { 521; X86-LABEL: test_mul_by_11: 522; X86: # %bb.0: 523; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 524; X86-NEXT: leal (%eax,%eax,4), %ecx 525; X86-NEXT: leal (%eax,%ecx,2), %eax 526; X86-NEXT: retl 527; 528; X64-HSW-LABEL: test_mul_by_11: 529; X64-HSW: # %bb.0: 530; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 531; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 532; X64-HSW-NEXT: leal (%rdi,%rax,2), %eax # sched: [1:0.50] 533; X64-HSW-NEXT: retq # sched: [7:1.00] 534; 535; X64-JAG-LABEL: test_mul_by_11: 536; X64-JAG: # %bb.0: 537; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 538; X64-JAG-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00] 539; X64-JAG-NEXT: leal (%rdi,%rax,2), %eax # sched: [2:1.00] 540; X64-JAG-NEXT: retq # sched: [4:1.00] 541; 542; X86-NOOPT-LABEL: test_mul_by_11: 543; X86-NOOPT: # %bb.0: 544; X86-NOOPT-NEXT: imull $11, {{[0-9]+}}(%esp), %eax 545; X86-NOOPT-NEXT: retl 546; 547; HSW-NOOPT-LABEL: test_mul_by_11: 548; HSW-NOOPT: # %bb.0: 549; HSW-NOOPT-NEXT: imull $11, %edi, %eax # sched: [3:1.00] 550; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 551; 552; JAG-NOOPT-LABEL: test_mul_by_11: 553; JAG-NOOPT: # %bb.0: 554; JAG-NOOPT-NEXT: imull $11, %edi, %eax # sched: [3:1.00] 555; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 556; 557; X64-SLM-LABEL: test_mul_by_11: 558; X64-SLM: # %bb.0: 559; X64-SLM-NEXT: imull $11, %edi, %eax # sched: [3:1.00] 560; X64-SLM-NEXT: retq # sched: [4:1.00] 561; 562; SLM-NOOPT-LABEL: test_mul_by_11: 563; SLM-NOOPT: # %bb.0: 564; SLM-NOOPT-NEXT: imull $11, %edi, %eax # sched: [3:1.00] 565; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 566 %mul = mul nsw i32 %x, 11 567 ret i32 %mul 568} 569 570define i32 @test_mul_by_12(i32 %x) { 571; X86-LABEL: test_mul_by_12: 572; X86: # %bb.0: 573; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 574; X86-NEXT: shll $2, %eax 575; X86-NEXT: leal (%eax,%eax,2), %eax 576; X86-NEXT: retl 577; 578; X64-HSW-LABEL: test_mul_by_12: 579; X64-HSW: # %bb.0: 580; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 581; X64-HSW-NEXT: shll $2, %edi # sched: [1:0.50] 582; X64-HSW-NEXT: leal (%rdi,%rdi,2), %eax # sched: [1:0.50] 583; X64-HSW-NEXT: retq # sched: [7:1.00] 584; 585; X64-JAG-LABEL: test_mul_by_12: 586; X64-JAG: # %bb.0: 587; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 588; X64-JAG-NEXT: shll $2, %edi # sched: [1:0.50] 589; X64-JAG-NEXT: leal (%rdi,%rdi,2), %eax # sched: [2:1.00] 590; X64-JAG-NEXT: retq # sched: [4:1.00] 591; 592; X86-NOOPT-LABEL: test_mul_by_12: 593; X86-NOOPT: # %bb.0: 594; X86-NOOPT-NEXT: imull $12, {{[0-9]+}}(%esp), %eax 595; X86-NOOPT-NEXT: retl 596; 597; HSW-NOOPT-LABEL: test_mul_by_12: 598; HSW-NOOPT: # %bb.0: 599; HSW-NOOPT-NEXT: imull $12, %edi, %eax # sched: [3:1.00] 600; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 601; 602; JAG-NOOPT-LABEL: test_mul_by_12: 603; JAG-NOOPT: # %bb.0: 604; JAG-NOOPT-NEXT: imull $12, %edi, %eax # sched: [3:1.00] 605; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 606; 607; X64-SLM-LABEL: test_mul_by_12: 608; X64-SLM: # %bb.0: 609; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 610; X64-SLM-NEXT: shll $2, %edi # sched: [1:1.00] 611; X64-SLM-NEXT: leal (%rdi,%rdi,2), %eax # sched: [1:1.00] 612; X64-SLM-NEXT: retq # sched: [4:1.00] 613; 614; SLM-NOOPT-LABEL: test_mul_by_12: 615; SLM-NOOPT: # %bb.0: 616; SLM-NOOPT-NEXT: imull $12, %edi, %eax # sched: [3:1.00] 617; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 618 %mul = mul nsw i32 %x, 12 619 ret i32 %mul 620} 621 622define i32 @test_mul_by_13(i32 %x) { 623; X86-LABEL: test_mul_by_13: 624; X86: # %bb.0: 625; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 626; X86-NEXT: leal (%eax,%eax,2), %ecx 627; X86-NEXT: leal (%eax,%ecx,4), %eax 628; X86-NEXT: retl 629; 630; X64-HSW-LABEL: test_mul_by_13: 631; X64-HSW: # %bb.0: 632; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 633; X64-HSW-NEXT: leal (%rdi,%rdi,2), %eax # sched: [1:0.50] 634; X64-HSW-NEXT: leal (%rdi,%rax,4), %eax # sched: [1:0.50] 635; X64-HSW-NEXT: retq # sched: [7:1.00] 636; 637; X64-JAG-LABEL: test_mul_by_13: 638; X64-JAG: # %bb.0: 639; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 640; X64-JAG-NEXT: leal (%rdi,%rdi,2), %eax # sched: [2:1.00] 641; X64-JAG-NEXT: leal (%rdi,%rax,4), %eax # sched: [2:1.00] 642; X64-JAG-NEXT: retq # sched: [4:1.00] 643; 644; X86-NOOPT-LABEL: test_mul_by_13: 645; X86-NOOPT: # %bb.0: 646; X86-NOOPT-NEXT: imull $13, {{[0-9]+}}(%esp), %eax 647; X86-NOOPT-NEXT: retl 648; 649; HSW-NOOPT-LABEL: test_mul_by_13: 650; HSW-NOOPT: # %bb.0: 651; HSW-NOOPT-NEXT: imull $13, %edi, %eax # sched: [3:1.00] 652; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 653; 654; JAG-NOOPT-LABEL: test_mul_by_13: 655; JAG-NOOPT: # %bb.0: 656; JAG-NOOPT-NEXT: imull $13, %edi, %eax # sched: [3:1.00] 657; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 658; 659; X64-SLM-LABEL: test_mul_by_13: 660; X64-SLM: # %bb.0: 661; X64-SLM-NEXT: imull $13, %edi, %eax # sched: [3:1.00] 662; X64-SLM-NEXT: retq # sched: [4:1.00] 663; 664; SLM-NOOPT-LABEL: test_mul_by_13: 665; SLM-NOOPT: # %bb.0: 666; SLM-NOOPT-NEXT: imull $13, %edi, %eax # sched: [3:1.00] 667; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 668 %mul = mul nsw i32 %x, 13 669 ret i32 %mul 670} 671 672define i32 @test_mul_by_14(i32 %x) { 673; X86-LABEL: test_mul_by_14: 674; X86: # %bb.0: 675; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 676; X86-NEXT: movl %ecx, %eax 677; X86-NEXT: shll $4, %eax 678; X86-NEXT: subl %ecx, %eax 679; X86-NEXT: subl %ecx, %eax 680; X86-NEXT: retl 681; 682; X64-HSW-LABEL: test_mul_by_14: 683; X64-HSW: # %bb.0: 684; X64-HSW-NEXT: movl %edi, %eax # sched: [1:0.25] 685; X64-HSW-NEXT: shll $4, %eax # sched: [1:0.50] 686; X64-HSW-NEXT: subl %edi, %eax # sched: [1:0.25] 687; X64-HSW-NEXT: subl %edi, %eax # sched: [1:0.25] 688; X64-HSW-NEXT: retq # sched: [7:1.00] 689; 690; X64-JAG-LABEL: test_mul_by_14: 691; X64-JAG: # %bb.0: 692; X64-JAG-NEXT: movl %edi, %eax # sched: [1:0.50] 693; X64-JAG-NEXT: shll $4, %eax # sched: [1:0.50] 694; X64-JAG-NEXT: subl %edi, %eax # sched: [1:0.50] 695; X64-JAG-NEXT: subl %edi, %eax # sched: [1:0.50] 696; X64-JAG-NEXT: retq # sched: [4:1.00] 697; 698; X86-NOOPT-LABEL: test_mul_by_14: 699; X86-NOOPT: # %bb.0: 700; X86-NOOPT-NEXT: imull $14, {{[0-9]+}}(%esp), %eax 701; X86-NOOPT-NEXT: retl 702; 703; HSW-NOOPT-LABEL: test_mul_by_14: 704; HSW-NOOPT: # %bb.0: 705; HSW-NOOPT-NEXT: imull $14, %edi, %eax # sched: [3:1.00] 706; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 707; 708; JAG-NOOPT-LABEL: test_mul_by_14: 709; JAG-NOOPT: # %bb.0: 710; JAG-NOOPT-NEXT: imull $14, %edi, %eax # sched: [3:1.00] 711; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 712; 713; X64-SLM-LABEL: test_mul_by_14: 714; X64-SLM: # %bb.0: 715; X64-SLM-NEXT: movl %edi, %eax # sched: [1:0.50] 716; X64-SLM-NEXT: shll $4, %eax # sched: [1:1.00] 717; X64-SLM-NEXT: subl %edi, %eax # sched: [1:0.50] 718; X64-SLM-NEXT: subl %edi, %eax # sched: [1:0.50] 719; X64-SLM-NEXT: retq # sched: [4:1.00] 720; 721; SLM-NOOPT-LABEL: test_mul_by_14: 722; SLM-NOOPT: # %bb.0: 723; SLM-NOOPT-NEXT: imull $14, %edi, %eax # sched: [3:1.00] 724; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 725 %mul = mul nsw i32 %x, 14 726 ret i32 %mul 727} 728 729define i32 @test_mul_by_15(i32 %x) { 730; X86-LABEL: test_mul_by_15: 731; X86: # %bb.0: 732; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 733; X86-NEXT: leal (%eax,%eax,4), %eax 734; X86-NEXT: leal (%eax,%eax,2), %eax 735; X86-NEXT: retl 736; 737; X64-HSW-LABEL: test_mul_by_15: 738; X64-HSW: # %bb.0: 739; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 740; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 741; X64-HSW-NEXT: leal (%rax,%rax,2), %eax # sched: [1:0.50] 742; X64-HSW-NEXT: retq # sched: [7:1.00] 743; 744; X64-JAG-LABEL: test_mul_by_15: 745; X64-JAG: # %bb.0: 746; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 747; X64-JAG-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00] 748; X64-JAG-NEXT: leal (%rax,%rax,2), %eax # sched: [2:1.00] 749; X64-JAG-NEXT: retq # sched: [4:1.00] 750; 751; X86-NOOPT-LABEL: test_mul_by_15: 752; X86-NOOPT: # %bb.0: 753; X86-NOOPT-NEXT: imull $15, {{[0-9]+}}(%esp), %eax 754; X86-NOOPT-NEXT: retl 755; 756; HSW-NOOPT-LABEL: test_mul_by_15: 757; HSW-NOOPT: # %bb.0: 758; HSW-NOOPT-NEXT: imull $15, %edi, %eax # sched: [3:1.00] 759; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 760; 761; JAG-NOOPT-LABEL: test_mul_by_15: 762; JAG-NOOPT: # %bb.0: 763; JAG-NOOPT-NEXT: imull $15, %edi, %eax # sched: [3:1.00] 764; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 765; 766; X64-SLM-LABEL: test_mul_by_15: 767; X64-SLM: # %bb.0: 768; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 769; X64-SLM-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:1.00] 770; X64-SLM-NEXT: leal (%rax,%rax,2), %eax # sched: [1:1.00] 771; X64-SLM-NEXT: retq # sched: [4:1.00] 772; 773; SLM-NOOPT-LABEL: test_mul_by_15: 774; SLM-NOOPT: # %bb.0: 775; SLM-NOOPT-NEXT: imull $15, %edi, %eax # sched: [3:1.00] 776; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 777 %mul = mul nsw i32 %x, 15 778 ret i32 %mul 779} 780 781define i32 @test_mul_by_16(i32 %x) { 782; X86-LABEL: test_mul_by_16: 783; X86: # %bb.0: 784; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 785; X86-NEXT: shll $4, %eax 786; X86-NEXT: retl 787; 788; X64-HSW-LABEL: test_mul_by_16: 789; X64-HSW: # %bb.0: 790; X64-HSW-NEXT: shll $4, %edi # sched: [1:0.50] 791; X64-HSW-NEXT: movl %edi, %eax # sched: [1:0.25] 792; X64-HSW-NEXT: retq # sched: [7:1.00] 793; 794; X64-JAG-LABEL: test_mul_by_16: 795; X64-JAG: # %bb.0: 796; X64-JAG-NEXT: shll $4, %edi # sched: [1:0.50] 797; X64-JAG-NEXT: movl %edi, %eax # sched: [1:0.50] 798; X64-JAG-NEXT: retq # sched: [4:1.00] 799; 800; X86-NOOPT-LABEL: test_mul_by_16: 801; X86-NOOPT: # %bb.0: 802; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax 803; X86-NOOPT-NEXT: shll $4, %eax 804; X86-NOOPT-NEXT: retl 805; 806; HSW-NOOPT-LABEL: test_mul_by_16: 807; HSW-NOOPT: # %bb.0: 808; HSW-NOOPT-NEXT: shll $4, %edi # sched: [1:0.50] 809; HSW-NOOPT-NEXT: movl %edi, %eax # sched: [1:0.25] 810; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 811; 812; JAG-NOOPT-LABEL: test_mul_by_16: 813; JAG-NOOPT: # %bb.0: 814; JAG-NOOPT-NEXT: shll $4, %edi # sched: [1:0.50] 815; JAG-NOOPT-NEXT: movl %edi, %eax # sched: [1:0.50] 816; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 817; 818; X64-SLM-LABEL: test_mul_by_16: 819; X64-SLM: # %bb.0: 820; X64-SLM-NEXT: shll $4, %edi # sched: [1:1.00] 821; X64-SLM-NEXT: movl %edi, %eax # sched: [1:0.50] 822; X64-SLM-NEXT: retq # sched: [4:1.00] 823; 824; SLM-NOOPT-LABEL: test_mul_by_16: 825; SLM-NOOPT: # %bb.0: 826; SLM-NOOPT-NEXT: shll $4, %edi # sched: [1:1.00] 827; SLM-NOOPT-NEXT: movl %edi, %eax # sched: [1:0.50] 828; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 829 %mul = mul nsw i32 %x, 16 830 ret i32 %mul 831} 832 833define i32 @test_mul_by_17(i32 %x) { 834; X86-LABEL: test_mul_by_17: 835; X86: # %bb.0: 836; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 837; X86-NEXT: movl %ecx, %eax 838; X86-NEXT: shll $4, %eax 839; X86-NEXT: addl %ecx, %eax 840; X86-NEXT: retl 841; 842; X64-HSW-LABEL: test_mul_by_17: 843; X64-HSW: # %bb.0: 844; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 845; X64-HSW-NEXT: movl %edi, %eax # sched: [1:0.25] 846; X64-HSW-NEXT: shll $4, %eax # sched: [1:0.50] 847; X64-HSW-NEXT: leal (%rax,%rdi), %eax # sched: [1:0.50] 848; X64-HSW-NEXT: retq # sched: [7:1.00] 849; 850; X64-JAG-LABEL: test_mul_by_17: 851; X64-JAG: # %bb.0: 852; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 853; X64-JAG-NEXT: movl %edi, %eax # sched: [1:0.50] 854; X64-JAG-NEXT: shll $4, %eax # sched: [1:0.50] 855; X64-JAG-NEXT: leal (%rax,%rdi), %eax # sched: [1:0.50] 856; X64-JAG-NEXT: retq # sched: [4:1.00] 857; 858; X86-NOOPT-LABEL: test_mul_by_17: 859; X86-NOOPT: # %bb.0: 860; X86-NOOPT-NEXT: imull $17, {{[0-9]+}}(%esp), %eax 861; X86-NOOPT-NEXT: retl 862; 863; HSW-NOOPT-LABEL: test_mul_by_17: 864; HSW-NOOPT: # %bb.0: 865; HSW-NOOPT-NEXT: imull $17, %edi, %eax # sched: [3:1.00] 866; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 867; 868; JAG-NOOPT-LABEL: test_mul_by_17: 869; JAG-NOOPT: # %bb.0: 870; JAG-NOOPT-NEXT: imull $17, %edi, %eax # sched: [3:1.00] 871; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 872; 873; X64-SLM-LABEL: test_mul_by_17: 874; X64-SLM: # %bb.0: 875; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 876; X64-SLM-NEXT: movl %edi, %eax # sched: [1:0.50] 877; X64-SLM-NEXT: shll $4, %eax # sched: [1:1.00] 878; X64-SLM-NEXT: leal (%rax,%rdi), %eax # sched: [1:1.00] 879; X64-SLM-NEXT: retq # sched: [4:1.00] 880; 881; SLM-NOOPT-LABEL: test_mul_by_17: 882; SLM-NOOPT: # %bb.0: 883; SLM-NOOPT-NEXT: imull $17, %edi, %eax # sched: [3:1.00] 884; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 885 %mul = mul nsw i32 %x, 17 886 ret i32 %mul 887} 888 889define i32 @test_mul_by_18(i32 %x) { 890; X86-LABEL: test_mul_by_18: 891; X86: # %bb.0: 892; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 893; X86-NEXT: addl %eax, %eax 894; X86-NEXT: leal (%eax,%eax,8), %eax 895; X86-NEXT: retl 896; 897; X64-HSW-LABEL: test_mul_by_18: 898; X64-HSW: # %bb.0: 899; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 900; X64-HSW-NEXT: addl %edi, %edi # sched: [1:0.25] 901; X64-HSW-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:0.50] 902; X64-HSW-NEXT: retq # sched: [7:1.00] 903; 904; X64-JAG-LABEL: test_mul_by_18: 905; X64-JAG: # %bb.0: 906; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 907; X64-JAG-NEXT: addl %edi, %edi # sched: [1:0.50] 908; X64-JAG-NEXT: leal (%rdi,%rdi,8), %eax # sched: [2:1.00] 909; X64-JAG-NEXT: retq # sched: [4:1.00] 910; 911; X86-NOOPT-LABEL: test_mul_by_18: 912; X86-NOOPT: # %bb.0: 913; X86-NOOPT-NEXT: imull $18, {{[0-9]+}}(%esp), %eax 914; X86-NOOPT-NEXT: retl 915; 916; HSW-NOOPT-LABEL: test_mul_by_18: 917; HSW-NOOPT: # %bb.0: 918; HSW-NOOPT-NEXT: imull $18, %edi, %eax # sched: [3:1.00] 919; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 920; 921; JAG-NOOPT-LABEL: test_mul_by_18: 922; JAG-NOOPT: # %bb.0: 923; JAG-NOOPT-NEXT: imull $18, %edi, %eax # sched: [3:1.00] 924; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 925; 926; X64-SLM-LABEL: test_mul_by_18: 927; X64-SLM: # %bb.0: 928; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 929; X64-SLM-NEXT: addl %edi, %edi # sched: [1:0.50] 930; X64-SLM-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:1.00] 931; X64-SLM-NEXT: retq # sched: [4:1.00] 932; 933; SLM-NOOPT-LABEL: test_mul_by_18: 934; SLM-NOOPT: # %bb.0: 935; SLM-NOOPT-NEXT: imull $18, %edi, %eax # sched: [3:1.00] 936; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 937 %mul = mul nsw i32 %x, 18 938 ret i32 %mul 939} 940 941define i32 @test_mul_by_19(i32 %x) { 942; X86-LABEL: test_mul_by_19: 943; X86: # %bb.0: 944; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 945; X86-NEXT: leal (%eax,%eax,8), %ecx 946; X86-NEXT: leal (%eax,%ecx,2), %eax 947; X86-NEXT: retl 948; 949; X64-HSW-LABEL: test_mul_by_19: 950; X64-HSW: # %bb.0: 951; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 952; X64-HSW-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:0.50] 953; X64-HSW-NEXT: leal (%rdi,%rax,2), %eax # sched: [1:0.50] 954; X64-HSW-NEXT: retq # sched: [7:1.00] 955; 956; X64-JAG-LABEL: test_mul_by_19: 957; X64-JAG: # %bb.0: 958; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 959; X64-JAG-NEXT: leal (%rdi,%rdi,8), %eax # sched: [2:1.00] 960; X64-JAG-NEXT: leal (%rdi,%rax,2), %eax # sched: [2:1.00] 961; X64-JAG-NEXT: retq # sched: [4:1.00] 962; 963; X86-NOOPT-LABEL: test_mul_by_19: 964; X86-NOOPT: # %bb.0: 965; X86-NOOPT-NEXT: imull $19, {{[0-9]+}}(%esp), %eax 966; X86-NOOPT-NEXT: retl 967; 968; HSW-NOOPT-LABEL: test_mul_by_19: 969; HSW-NOOPT: # %bb.0: 970; HSW-NOOPT-NEXT: imull $19, %edi, %eax # sched: [3:1.00] 971; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 972; 973; JAG-NOOPT-LABEL: test_mul_by_19: 974; JAG-NOOPT: # %bb.0: 975; JAG-NOOPT-NEXT: imull $19, %edi, %eax # sched: [3:1.00] 976; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 977; 978; X64-SLM-LABEL: test_mul_by_19: 979; X64-SLM: # %bb.0: 980; X64-SLM-NEXT: imull $19, %edi, %eax # sched: [3:1.00] 981; X64-SLM-NEXT: retq # sched: [4:1.00] 982; 983; SLM-NOOPT-LABEL: test_mul_by_19: 984; SLM-NOOPT: # %bb.0: 985; SLM-NOOPT-NEXT: imull $19, %edi, %eax # sched: [3:1.00] 986; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 987 %mul = mul nsw i32 %x, 19 988 ret i32 %mul 989} 990 991define i32 @test_mul_by_20(i32 %x) { 992; X86-LABEL: test_mul_by_20: 993; X86: # %bb.0: 994; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 995; X86-NEXT: shll $2, %eax 996; X86-NEXT: leal (%eax,%eax,4), %eax 997; X86-NEXT: retl 998; 999; X64-HSW-LABEL: test_mul_by_20: 1000; X64-HSW: # %bb.0: 1001; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1002; X64-HSW-NEXT: shll $2, %edi # sched: [1:0.50] 1003; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 1004; X64-HSW-NEXT: retq # sched: [7:1.00] 1005; 1006; X64-JAG-LABEL: test_mul_by_20: 1007; X64-JAG: # %bb.0: 1008; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1009; X64-JAG-NEXT: shll $2, %edi # sched: [1:0.50] 1010; X64-JAG-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00] 1011; X64-JAG-NEXT: retq # sched: [4:1.00] 1012; 1013; X86-NOOPT-LABEL: test_mul_by_20: 1014; X86-NOOPT: # %bb.0: 1015; X86-NOOPT-NEXT: imull $20, {{[0-9]+}}(%esp), %eax 1016; X86-NOOPT-NEXT: retl 1017; 1018; HSW-NOOPT-LABEL: test_mul_by_20: 1019; HSW-NOOPT: # %bb.0: 1020; HSW-NOOPT-NEXT: imull $20, %edi, %eax # sched: [3:1.00] 1021; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1022; 1023; JAG-NOOPT-LABEL: test_mul_by_20: 1024; JAG-NOOPT: # %bb.0: 1025; JAG-NOOPT-NEXT: imull $20, %edi, %eax # sched: [3:1.00] 1026; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1027; 1028; X64-SLM-LABEL: test_mul_by_20: 1029; X64-SLM: # %bb.0: 1030; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 1031; X64-SLM-NEXT: shll $2, %edi # sched: [1:1.00] 1032; X64-SLM-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:1.00] 1033; X64-SLM-NEXT: retq # sched: [4:1.00] 1034; 1035; SLM-NOOPT-LABEL: test_mul_by_20: 1036; SLM-NOOPT: # %bb.0: 1037; SLM-NOOPT-NEXT: imull $20, %edi, %eax # sched: [3:1.00] 1038; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1039 %mul = mul nsw i32 %x, 20 1040 ret i32 %mul 1041} 1042 1043define i32 @test_mul_by_21(i32 %x) { 1044; X86-LABEL: test_mul_by_21: 1045; X86: # %bb.0: 1046; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1047; X86-NEXT: leal (%eax,%eax,4), %ecx 1048; X86-NEXT: leal (%eax,%ecx,4), %eax 1049; X86-NEXT: retl 1050; 1051; X64-HSW-LABEL: test_mul_by_21: 1052; X64-HSW: # %bb.0: 1053; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1054; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 1055; X64-HSW-NEXT: leal (%rdi,%rax,4), %eax # sched: [1:0.50] 1056; X64-HSW-NEXT: retq # sched: [7:1.00] 1057; 1058; X64-JAG-LABEL: test_mul_by_21: 1059; X64-JAG: # %bb.0: 1060; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1061; X64-JAG-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00] 1062; X64-JAG-NEXT: leal (%rdi,%rax,4), %eax # sched: [2:1.00] 1063; X64-JAG-NEXT: retq # sched: [4:1.00] 1064; 1065; X86-NOOPT-LABEL: test_mul_by_21: 1066; X86-NOOPT: # %bb.0: 1067; X86-NOOPT-NEXT: imull $21, {{[0-9]+}}(%esp), %eax 1068; X86-NOOPT-NEXT: retl 1069; 1070; HSW-NOOPT-LABEL: test_mul_by_21: 1071; HSW-NOOPT: # %bb.0: 1072; HSW-NOOPT-NEXT: imull $21, %edi, %eax # sched: [3:1.00] 1073; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1074; 1075; JAG-NOOPT-LABEL: test_mul_by_21: 1076; JAG-NOOPT: # %bb.0: 1077; JAG-NOOPT-NEXT: imull $21, %edi, %eax # sched: [3:1.00] 1078; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1079; 1080; X64-SLM-LABEL: test_mul_by_21: 1081; X64-SLM: # %bb.0: 1082; X64-SLM-NEXT: imull $21, %edi, %eax # sched: [3:1.00] 1083; X64-SLM-NEXT: retq # sched: [4:1.00] 1084; 1085; SLM-NOOPT-LABEL: test_mul_by_21: 1086; SLM-NOOPT: # %bb.0: 1087; SLM-NOOPT-NEXT: imull $21, %edi, %eax # sched: [3:1.00] 1088; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1089 %mul = mul nsw i32 %x, 21 1090 ret i32 %mul 1091} 1092 1093define i32 @test_mul_by_22(i32 %x) { 1094; X86-LABEL: test_mul_by_22: 1095; X86: # %bb.0: 1096; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1097; X86-NEXT: leal (%ecx,%ecx,4), %eax 1098; X86-NEXT: leal (%ecx,%eax,4), %eax 1099; X86-NEXT: addl %ecx, %eax 1100; X86-NEXT: retl 1101; 1102; X64-HSW-LABEL: test_mul_by_22: 1103; X64-HSW: # %bb.0: 1104; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1105; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 1106; X64-HSW-NEXT: leal (%rdi,%rax,4), %eax # sched: [1:0.50] 1107; X64-HSW-NEXT: addl %edi, %eax # sched: [1:0.25] 1108; X64-HSW-NEXT: retq # sched: [7:1.00] 1109; 1110; X64-JAG-LABEL: test_mul_by_22: 1111; X64-JAG: # %bb.0: 1112; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1113; X64-JAG-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00] 1114; X64-JAG-NEXT: leal (%rdi,%rax,4), %eax # sched: [2:1.00] 1115; X64-JAG-NEXT: addl %edi, %eax # sched: [1:0.50] 1116; X64-JAG-NEXT: retq # sched: [4:1.00] 1117; 1118; X86-NOOPT-LABEL: test_mul_by_22: 1119; X86-NOOPT: # %bb.0: 1120; X86-NOOPT-NEXT: imull $22, {{[0-9]+}}(%esp), %eax 1121; X86-NOOPT-NEXT: retl 1122; 1123; HSW-NOOPT-LABEL: test_mul_by_22: 1124; HSW-NOOPT: # %bb.0: 1125; HSW-NOOPT-NEXT: imull $22, %edi, %eax # sched: [3:1.00] 1126; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1127; 1128; JAG-NOOPT-LABEL: test_mul_by_22: 1129; JAG-NOOPT: # %bb.0: 1130; JAG-NOOPT-NEXT: imull $22, %edi, %eax # sched: [3:1.00] 1131; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1132; 1133; X64-SLM-LABEL: test_mul_by_22: 1134; X64-SLM: # %bb.0: 1135; X64-SLM-NEXT: imull $22, %edi, %eax # sched: [3:1.00] 1136; X64-SLM-NEXT: retq # sched: [4:1.00] 1137; 1138; SLM-NOOPT-LABEL: test_mul_by_22: 1139; SLM-NOOPT: # %bb.0: 1140; SLM-NOOPT-NEXT: imull $22, %edi, %eax # sched: [3:1.00] 1141; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1142 %mul = mul nsw i32 %x, 22 1143 ret i32 %mul 1144} 1145 1146define i32 @test_mul_by_23(i32 %x) { 1147; X86-LABEL: test_mul_by_23: 1148; X86: # %bb.0: 1149; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1150; X86-NEXT: leal (%ecx,%ecx,2), %eax 1151; X86-NEXT: shll $3, %eax 1152; X86-NEXT: subl %ecx, %eax 1153; X86-NEXT: retl 1154; 1155; X64-HSW-LABEL: test_mul_by_23: 1156; X64-HSW: # %bb.0: 1157; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1158; X64-HSW-NEXT: leal (%rdi,%rdi,2), %eax # sched: [1:0.50] 1159; X64-HSW-NEXT: shll $3, %eax # sched: [1:0.50] 1160; X64-HSW-NEXT: subl %edi, %eax # sched: [1:0.25] 1161; X64-HSW-NEXT: retq # sched: [7:1.00] 1162; 1163; X64-JAG-LABEL: test_mul_by_23: 1164; X64-JAG: # %bb.0: 1165; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1166; X64-JAG-NEXT: leal (%rdi,%rdi,2), %eax # sched: [2:1.00] 1167; X64-JAG-NEXT: shll $3, %eax # sched: [1:0.50] 1168; X64-JAG-NEXT: subl %edi, %eax # sched: [1:0.50] 1169; X64-JAG-NEXT: retq # sched: [4:1.00] 1170; 1171; X86-NOOPT-LABEL: test_mul_by_23: 1172; X86-NOOPT: # %bb.0: 1173; X86-NOOPT-NEXT: imull $23, {{[0-9]+}}(%esp), %eax 1174; X86-NOOPT-NEXT: retl 1175; 1176; HSW-NOOPT-LABEL: test_mul_by_23: 1177; HSW-NOOPT: # %bb.0: 1178; HSW-NOOPT-NEXT: imull $23, %edi, %eax # sched: [3:1.00] 1179; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1180; 1181; JAG-NOOPT-LABEL: test_mul_by_23: 1182; JAG-NOOPT: # %bb.0: 1183; JAG-NOOPT-NEXT: imull $23, %edi, %eax # sched: [3:1.00] 1184; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1185; 1186; X64-SLM-LABEL: test_mul_by_23: 1187; X64-SLM: # %bb.0: 1188; X64-SLM-NEXT: imull $23, %edi, %eax # sched: [3:1.00] 1189; X64-SLM-NEXT: retq # sched: [4:1.00] 1190; 1191; SLM-NOOPT-LABEL: test_mul_by_23: 1192; SLM-NOOPT: # %bb.0: 1193; SLM-NOOPT-NEXT: imull $23, %edi, %eax # sched: [3:1.00] 1194; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1195 %mul = mul nsw i32 %x, 23 1196 ret i32 %mul 1197} 1198 1199define i32 @test_mul_by_24(i32 %x) { 1200; X86-LABEL: test_mul_by_24: 1201; X86: # %bb.0: 1202; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1203; X86-NEXT: shll $3, %eax 1204; X86-NEXT: leal (%eax,%eax,2), %eax 1205; X86-NEXT: retl 1206; 1207; X64-HSW-LABEL: test_mul_by_24: 1208; X64-HSW: # %bb.0: 1209; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1210; X64-HSW-NEXT: shll $3, %edi # sched: [1:0.50] 1211; X64-HSW-NEXT: leal (%rdi,%rdi,2), %eax # sched: [1:0.50] 1212; X64-HSW-NEXT: retq # sched: [7:1.00] 1213; 1214; X64-JAG-LABEL: test_mul_by_24: 1215; X64-JAG: # %bb.0: 1216; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1217; X64-JAG-NEXT: shll $3, %edi # sched: [1:0.50] 1218; X64-JAG-NEXT: leal (%rdi,%rdi,2), %eax # sched: [2:1.00] 1219; X64-JAG-NEXT: retq # sched: [4:1.00] 1220; 1221; X86-NOOPT-LABEL: test_mul_by_24: 1222; X86-NOOPT: # %bb.0: 1223; X86-NOOPT-NEXT: imull $24, {{[0-9]+}}(%esp), %eax 1224; X86-NOOPT-NEXT: retl 1225; 1226; HSW-NOOPT-LABEL: test_mul_by_24: 1227; HSW-NOOPT: # %bb.0: 1228; HSW-NOOPT-NEXT: imull $24, %edi, %eax # sched: [3:1.00] 1229; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1230; 1231; JAG-NOOPT-LABEL: test_mul_by_24: 1232; JAG-NOOPT: # %bb.0: 1233; JAG-NOOPT-NEXT: imull $24, %edi, %eax # sched: [3:1.00] 1234; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1235; 1236; X64-SLM-LABEL: test_mul_by_24: 1237; X64-SLM: # %bb.0: 1238; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 1239; X64-SLM-NEXT: shll $3, %edi # sched: [1:1.00] 1240; X64-SLM-NEXT: leal (%rdi,%rdi,2), %eax # sched: [1:1.00] 1241; X64-SLM-NEXT: retq # sched: [4:1.00] 1242; 1243; SLM-NOOPT-LABEL: test_mul_by_24: 1244; SLM-NOOPT: # %bb.0: 1245; SLM-NOOPT-NEXT: imull $24, %edi, %eax # sched: [3:1.00] 1246; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1247 %mul = mul nsw i32 %x, 24 1248 ret i32 %mul 1249} 1250 1251define i32 @test_mul_by_25(i32 %x) { 1252; X86-LABEL: test_mul_by_25: 1253; X86: # %bb.0: 1254; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1255; X86-NEXT: leal (%eax,%eax,4), %eax 1256; X86-NEXT: leal (%eax,%eax,4), %eax 1257; X86-NEXT: retl 1258; 1259; X64-HSW-LABEL: test_mul_by_25: 1260; X64-HSW: # %bb.0: 1261; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1262; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 1263; X64-HSW-NEXT: leal (%rax,%rax,4), %eax # sched: [1:0.50] 1264; X64-HSW-NEXT: retq # sched: [7:1.00] 1265; 1266; X64-JAG-LABEL: test_mul_by_25: 1267; X64-JAG: # %bb.0: 1268; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1269; X64-JAG-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00] 1270; X64-JAG-NEXT: leal (%rax,%rax,4), %eax # sched: [2:1.00] 1271; X64-JAG-NEXT: retq # sched: [4:1.00] 1272; 1273; X86-NOOPT-LABEL: test_mul_by_25: 1274; X86-NOOPT: # %bb.0: 1275; X86-NOOPT-NEXT: imull $25, {{[0-9]+}}(%esp), %eax 1276; X86-NOOPT-NEXT: retl 1277; 1278; HSW-NOOPT-LABEL: test_mul_by_25: 1279; HSW-NOOPT: # %bb.0: 1280; HSW-NOOPT-NEXT: imull $25, %edi, %eax # sched: [3:1.00] 1281; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1282; 1283; JAG-NOOPT-LABEL: test_mul_by_25: 1284; JAG-NOOPT: # %bb.0: 1285; JAG-NOOPT-NEXT: imull $25, %edi, %eax # sched: [3:1.00] 1286; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1287; 1288; X64-SLM-LABEL: test_mul_by_25: 1289; X64-SLM: # %bb.0: 1290; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 1291; X64-SLM-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:1.00] 1292; X64-SLM-NEXT: leal (%rax,%rax,4), %eax # sched: [1:1.00] 1293; X64-SLM-NEXT: retq # sched: [4:1.00] 1294; 1295; SLM-NOOPT-LABEL: test_mul_by_25: 1296; SLM-NOOPT: # %bb.0: 1297; SLM-NOOPT-NEXT: imull $25, %edi, %eax # sched: [3:1.00] 1298; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1299 %mul = mul nsw i32 %x, 25 1300 ret i32 %mul 1301} 1302 1303define i32 @test_mul_by_26(i32 %x) { 1304; X86-LABEL: test_mul_by_26: 1305; X86: # %bb.0: 1306; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1307; X86-NEXT: leal (%ecx,%ecx,4), %eax 1308; X86-NEXT: leal (%eax,%eax,4), %eax 1309; X86-NEXT: addl %ecx, %eax 1310; X86-NEXT: retl 1311; 1312; X64-HSW-LABEL: test_mul_by_26: 1313; X64-HSW: # %bb.0: 1314; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1315; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 1316; X64-HSW-NEXT: leal (%rax,%rax,4), %eax # sched: [1:0.50] 1317; X64-HSW-NEXT: addl %edi, %eax # sched: [1:0.25] 1318; X64-HSW-NEXT: retq # sched: [7:1.00] 1319; 1320; X64-JAG-LABEL: test_mul_by_26: 1321; X64-JAG: # %bb.0: 1322; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1323; X64-JAG-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00] 1324; X64-JAG-NEXT: leal (%rax,%rax,4), %eax # sched: [2:1.00] 1325; X64-JAG-NEXT: addl %edi, %eax # sched: [1:0.50] 1326; X64-JAG-NEXT: retq # sched: [4:1.00] 1327; 1328; X86-NOOPT-LABEL: test_mul_by_26: 1329; X86-NOOPT: # %bb.0: 1330; X86-NOOPT-NEXT: imull $26, {{[0-9]+}}(%esp), %eax 1331; X86-NOOPT-NEXT: retl 1332; 1333; HSW-NOOPT-LABEL: test_mul_by_26: 1334; HSW-NOOPT: # %bb.0: 1335; HSW-NOOPT-NEXT: imull $26, %edi, %eax # sched: [3:1.00] 1336; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1337; 1338; JAG-NOOPT-LABEL: test_mul_by_26: 1339; JAG-NOOPT: # %bb.0: 1340; JAG-NOOPT-NEXT: imull $26, %edi, %eax # sched: [3:1.00] 1341; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1342; 1343; X64-SLM-LABEL: test_mul_by_26: 1344; X64-SLM: # %bb.0: 1345; X64-SLM-NEXT: imull $26, %edi, %eax # sched: [3:1.00] 1346; X64-SLM-NEXT: retq # sched: [4:1.00] 1347; 1348; SLM-NOOPT-LABEL: test_mul_by_26: 1349; SLM-NOOPT: # %bb.0: 1350; SLM-NOOPT-NEXT: imull $26, %edi, %eax # sched: [3:1.00] 1351; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1352 %mul = mul nsw i32 %x, 26 1353 ret i32 %mul 1354} 1355 1356define i32 @test_mul_by_27(i32 %x) { 1357; X86-LABEL: test_mul_by_27: 1358; X86: # %bb.0: 1359; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1360; X86-NEXT: leal (%eax,%eax,8), %eax 1361; X86-NEXT: leal (%eax,%eax,2), %eax 1362; X86-NEXT: retl 1363; 1364; X64-HSW-LABEL: test_mul_by_27: 1365; X64-HSW: # %bb.0: 1366; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1367; X64-HSW-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:0.50] 1368; X64-HSW-NEXT: leal (%rax,%rax,2), %eax # sched: [1:0.50] 1369; X64-HSW-NEXT: retq # sched: [7:1.00] 1370; 1371; X64-JAG-LABEL: test_mul_by_27: 1372; X64-JAG: # %bb.0: 1373; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1374; X64-JAG-NEXT: leal (%rdi,%rdi,8), %eax # sched: [2:1.00] 1375; X64-JAG-NEXT: leal (%rax,%rax,2), %eax # sched: [2:1.00] 1376; X64-JAG-NEXT: retq # sched: [4:1.00] 1377; 1378; X86-NOOPT-LABEL: test_mul_by_27: 1379; X86-NOOPT: # %bb.0: 1380; X86-NOOPT-NEXT: imull $27, {{[0-9]+}}(%esp), %eax 1381; X86-NOOPT-NEXT: retl 1382; 1383; HSW-NOOPT-LABEL: test_mul_by_27: 1384; HSW-NOOPT: # %bb.0: 1385; HSW-NOOPT-NEXT: imull $27, %edi, %eax # sched: [3:1.00] 1386; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1387; 1388; JAG-NOOPT-LABEL: test_mul_by_27: 1389; JAG-NOOPT: # %bb.0: 1390; JAG-NOOPT-NEXT: imull $27, %edi, %eax # sched: [3:1.00] 1391; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1392; 1393; X64-SLM-LABEL: test_mul_by_27: 1394; X64-SLM: # %bb.0: 1395; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 1396; X64-SLM-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:1.00] 1397; X64-SLM-NEXT: leal (%rax,%rax,2), %eax # sched: [1:1.00] 1398; X64-SLM-NEXT: retq # sched: [4:1.00] 1399; 1400; SLM-NOOPT-LABEL: test_mul_by_27: 1401; SLM-NOOPT: # %bb.0: 1402; SLM-NOOPT-NEXT: imull $27, %edi, %eax # sched: [3:1.00] 1403; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1404 %mul = mul nsw i32 %x, 27 1405 ret i32 %mul 1406} 1407 1408define i32 @test_mul_by_28(i32 %x) { 1409; X86-LABEL: test_mul_by_28: 1410; X86: # %bb.0: 1411; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1412; X86-NEXT: leal (%ecx,%ecx,8), %eax 1413; X86-NEXT: leal (%eax,%eax,2), %eax 1414; X86-NEXT: addl %ecx, %eax 1415; X86-NEXT: retl 1416; 1417; X64-HSW-LABEL: test_mul_by_28: 1418; X64-HSW: # %bb.0: 1419; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1420; X64-HSW-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:0.50] 1421; X64-HSW-NEXT: leal (%rax,%rax,2), %eax # sched: [1:0.50] 1422; X64-HSW-NEXT: addl %edi, %eax # sched: [1:0.25] 1423; X64-HSW-NEXT: retq # sched: [7:1.00] 1424; 1425; X64-JAG-LABEL: test_mul_by_28: 1426; X64-JAG: # %bb.0: 1427; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1428; X64-JAG-NEXT: leal (%rdi,%rdi,8), %eax # sched: [2:1.00] 1429; X64-JAG-NEXT: leal (%rax,%rax,2), %eax # sched: [2:1.00] 1430; X64-JAG-NEXT: addl %edi, %eax # sched: [1:0.50] 1431; X64-JAG-NEXT: retq # sched: [4:1.00] 1432; 1433; X86-NOOPT-LABEL: test_mul_by_28: 1434; X86-NOOPT: # %bb.0: 1435; X86-NOOPT-NEXT: imull $28, {{[0-9]+}}(%esp), %eax 1436; X86-NOOPT-NEXT: retl 1437; 1438; HSW-NOOPT-LABEL: test_mul_by_28: 1439; HSW-NOOPT: # %bb.0: 1440; HSW-NOOPT-NEXT: imull $28, %edi, %eax # sched: [3:1.00] 1441; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1442; 1443; JAG-NOOPT-LABEL: test_mul_by_28: 1444; JAG-NOOPT: # %bb.0: 1445; JAG-NOOPT-NEXT: imull $28, %edi, %eax # sched: [3:1.00] 1446; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1447; 1448; X64-SLM-LABEL: test_mul_by_28: 1449; X64-SLM: # %bb.0: 1450; X64-SLM-NEXT: imull $28, %edi, %eax # sched: [3:1.00] 1451; X64-SLM-NEXT: retq # sched: [4:1.00] 1452; 1453; SLM-NOOPT-LABEL: test_mul_by_28: 1454; SLM-NOOPT: # %bb.0: 1455; SLM-NOOPT-NEXT: imull $28, %edi, %eax # sched: [3:1.00] 1456; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1457 %mul = mul nsw i32 %x, 28 1458 ret i32 %mul 1459} 1460 1461define i32 @test_mul_by_29(i32 %x) { 1462; X86-LABEL: test_mul_by_29: 1463; X86: # %bb.0: 1464; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1465; X86-NEXT: leal (%ecx,%ecx,8), %eax 1466; X86-NEXT: leal (%eax,%eax,2), %eax 1467; X86-NEXT: addl %ecx, %eax 1468; X86-NEXT: addl %ecx, %eax 1469; X86-NEXT: retl 1470; 1471; X64-HSW-LABEL: test_mul_by_29: 1472; X64-HSW: # %bb.0: 1473; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1474; X64-HSW-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:0.50] 1475; X64-HSW-NEXT: leal (%rax,%rax,2), %eax # sched: [1:0.50] 1476; X64-HSW-NEXT: addl %edi, %eax # sched: [1:0.25] 1477; X64-HSW-NEXT: addl %edi, %eax # sched: [1:0.25] 1478; X64-HSW-NEXT: retq # sched: [7:1.00] 1479; 1480; X64-JAG-LABEL: test_mul_by_29: 1481; X64-JAG: # %bb.0: 1482; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1483; X64-JAG-NEXT: leal (%rdi,%rdi,8), %eax # sched: [2:1.00] 1484; X64-JAG-NEXT: leal (%rax,%rax,2), %eax # sched: [2:1.00] 1485; X64-JAG-NEXT: addl %edi, %eax # sched: [1:0.50] 1486; X64-JAG-NEXT: addl %edi, %eax # sched: [1:0.50] 1487; X64-JAG-NEXT: retq # sched: [4:1.00] 1488; 1489; X86-NOOPT-LABEL: test_mul_by_29: 1490; X86-NOOPT: # %bb.0: 1491; X86-NOOPT-NEXT: imull $29, {{[0-9]+}}(%esp), %eax 1492; X86-NOOPT-NEXT: retl 1493; 1494; HSW-NOOPT-LABEL: test_mul_by_29: 1495; HSW-NOOPT: # %bb.0: 1496; HSW-NOOPT-NEXT: imull $29, %edi, %eax # sched: [3:1.00] 1497; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1498; 1499; JAG-NOOPT-LABEL: test_mul_by_29: 1500; JAG-NOOPT: # %bb.0: 1501; JAG-NOOPT-NEXT: imull $29, %edi, %eax # sched: [3:1.00] 1502; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1503; 1504; X64-SLM-LABEL: test_mul_by_29: 1505; X64-SLM: # %bb.0: 1506; X64-SLM-NEXT: imull $29, %edi, %eax # sched: [3:1.00] 1507; X64-SLM-NEXT: retq # sched: [4:1.00] 1508; 1509; SLM-NOOPT-LABEL: test_mul_by_29: 1510; SLM-NOOPT: # %bb.0: 1511; SLM-NOOPT-NEXT: imull $29, %edi, %eax # sched: [3:1.00] 1512; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1513 %mul = mul nsw i32 %x, 29 1514 ret i32 %mul 1515} 1516 1517define i32 @test_mul_by_30(i32 %x) { 1518; X86-LABEL: test_mul_by_30: 1519; X86: # %bb.0: 1520; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1521; X86-NEXT: movl %ecx, %eax 1522; X86-NEXT: shll $5, %eax 1523; X86-NEXT: subl %ecx, %eax 1524; X86-NEXT: subl %ecx, %eax 1525; X86-NEXT: retl 1526; 1527; X64-HSW-LABEL: test_mul_by_30: 1528; X64-HSW: # %bb.0: 1529; X64-HSW-NEXT: movl %edi, %eax # sched: [1:0.25] 1530; X64-HSW-NEXT: shll $5, %eax # sched: [1:0.50] 1531; X64-HSW-NEXT: subl %edi, %eax # sched: [1:0.25] 1532; X64-HSW-NEXT: subl %edi, %eax # sched: [1:0.25] 1533; X64-HSW-NEXT: retq # sched: [7:1.00] 1534; 1535; X64-JAG-LABEL: test_mul_by_30: 1536; X64-JAG: # %bb.0: 1537; X64-JAG-NEXT: movl %edi, %eax # sched: [1:0.50] 1538; X64-JAG-NEXT: shll $5, %eax # sched: [1:0.50] 1539; X64-JAG-NEXT: subl %edi, %eax # sched: [1:0.50] 1540; X64-JAG-NEXT: subl %edi, %eax # sched: [1:0.50] 1541; X64-JAG-NEXT: retq # sched: [4:1.00] 1542; 1543; X86-NOOPT-LABEL: test_mul_by_30: 1544; X86-NOOPT: # %bb.0: 1545; X86-NOOPT-NEXT: imull $30, {{[0-9]+}}(%esp), %eax 1546; X86-NOOPT-NEXT: retl 1547; 1548; HSW-NOOPT-LABEL: test_mul_by_30: 1549; HSW-NOOPT: # %bb.0: 1550; HSW-NOOPT-NEXT: imull $30, %edi, %eax # sched: [3:1.00] 1551; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1552; 1553; JAG-NOOPT-LABEL: test_mul_by_30: 1554; JAG-NOOPT: # %bb.0: 1555; JAG-NOOPT-NEXT: imull $30, %edi, %eax # sched: [3:1.00] 1556; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1557; 1558; X64-SLM-LABEL: test_mul_by_30: 1559; X64-SLM: # %bb.0: 1560; X64-SLM-NEXT: movl %edi, %eax # sched: [1:0.50] 1561; X64-SLM-NEXT: shll $5, %eax # sched: [1:1.00] 1562; X64-SLM-NEXT: subl %edi, %eax # sched: [1:0.50] 1563; X64-SLM-NEXT: subl %edi, %eax # sched: [1:0.50] 1564; X64-SLM-NEXT: retq # sched: [4:1.00] 1565; 1566; SLM-NOOPT-LABEL: test_mul_by_30: 1567; SLM-NOOPT: # %bb.0: 1568; SLM-NOOPT-NEXT: imull $30, %edi, %eax # sched: [3:1.00] 1569; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1570 %mul = mul nsw i32 %x, 30 1571 ret i32 %mul 1572} 1573 1574define i32 @test_mul_by_31(i32 %x) { 1575; X86-LABEL: test_mul_by_31: 1576; X86: # %bb.0: 1577; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1578; X86-NEXT: movl %ecx, %eax 1579; X86-NEXT: shll $5, %eax 1580; X86-NEXT: subl %ecx, %eax 1581; X86-NEXT: retl 1582; 1583; X64-HSW-LABEL: test_mul_by_31: 1584; X64-HSW: # %bb.0: 1585; X64-HSW-NEXT: movl %edi, %eax # sched: [1:0.25] 1586; X64-HSW-NEXT: shll $5, %eax # sched: [1:0.50] 1587; X64-HSW-NEXT: subl %edi, %eax # sched: [1:0.25] 1588; X64-HSW-NEXT: retq # sched: [7:1.00] 1589; 1590; X64-JAG-LABEL: test_mul_by_31: 1591; X64-JAG: # %bb.0: 1592; X64-JAG-NEXT: movl %edi, %eax # sched: [1:0.50] 1593; X64-JAG-NEXT: shll $5, %eax # sched: [1:0.50] 1594; X64-JAG-NEXT: subl %edi, %eax # sched: [1:0.50] 1595; X64-JAG-NEXT: retq # sched: [4:1.00] 1596; 1597; X86-NOOPT-LABEL: test_mul_by_31: 1598; X86-NOOPT: # %bb.0: 1599; X86-NOOPT-NEXT: imull $31, {{[0-9]+}}(%esp), %eax 1600; X86-NOOPT-NEXT: retl 1601; 1602; HSW-NOOPT-LABEL: test_mul_by_31: 1603; HSW-NOOPT: # %bb.0: 1604; HSW-NOOPT-NEXT: imull $31, %edi, %eax # sched: [3:1.00] 1605; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1606; 1607; JAG-NOOPT-LABEL: test_mul_by_31: 1608; JAG-NOOPT: # %bb.0: 1609; JAG-NOOPT-NEXT: imull $31, %edi, %eax # sched: [3:1.00] 1610; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1611; 1612; X64-SLM-LABEL: test_mul_by_31: 1613; X64-SLM: # %bb.0: 1614; X64-SLM-NEXT: movl %edi, %eax # sched: [1:0.50] 1615; X64-SLM-NEXT: shll $5, %eax # sched: [1:1.00] 1616; X64-SLM-NEXT: subl %edi, %eax # sched: [1:0.50] 1617; X64-SLM-NEXT: retq # sched: [4:1.00] 1618; 1619; SLM-NOOPT-LABEL: test_mul_by_31: 1620; SLM-NOOPT: # %bb.0: 1621; SLM-NOOPT-NEXT: imull $31, %edi, %eax # sched: [3:1.00] 1622; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1623 %mul = mul nsw i32 %x, 31 1624 ret i32 %mul 1625} 1626 1627define i32 @test_mul_by_32(i32 %x) { 1628; X86-LABEL: test_mul_by_32: 1629; X86: # %bb.0: 1630; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1631; X86-NEXT: shll $5, %eax 1632; X86-NEXT: retl 1633; 1634; X64-HSW-LABEL: test_mul_by_32: 1635; X64-HSW: # %bb.0: 1636; X64-HSW-NEXT: shll $5, %edi # sched: [1:0.50] 1637; X64-HSW-NEXT: movl %edi, %eax # sched: [1:0.25] 1638; X64-HSW-NEXT: retq # sched: [7:1.00] 1639; 1640; X64-JAG-LABEL: test_mul_by_32: 1641; X64-JAG: # %bb.0: 1642; X64-JAG-NEXT: shll $5, %edi # sched: [1:0.50] 1643; X64-JAG-NEXT: movl %edi, %eax # sched: [1:0.50] 1644; X64-JAG-NEXT: retq # sched: [4:1.00] 1645; 1646; X86-NOOPT-LABEL: test_mul_by_32: 1647; X86-NOOPT: # %bb.0: 1648; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax 1649; X86-NOOPT-NEXT: shll $5, %eax 1650; X86-NOOPT-NEXT: retl 1651; 1652; HSW-NOOPT-LABEL: test_mul_by_32: 1653; HSW-NOOPT: # %bb.0: 1654; HSW-NOOPT-NEXT: shll $5, %edi # sched: [1:0.50] 1655; HSW-NOOPT-NEXT: movl %edi, %eax # sched: [1:0.25] 1656; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1657; 1658; JAG-NOOPT-LABEL: test_mul_by_32: 1659; JAG-NOOPT: # %bb.0: 1660; JAG-NOOPT-NEXT: shll $5, %edi # sched: [1:0.50] 1661; JAG-NOOPT-NEXT: movl %edi, %eax # sched: [1:0.50] 1662; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1663; 1664; X64-SLM-LABEL: test_mul_by_32: 1665; X64-SLM: # %bb.0: 1666; X64-SLM-NEXT: shll $5, %edi # sched: [1:1.00] 1667; X64-SLM-NEXT: movl %edi, %eax # sched: [1:0.50] 1668; X64-SLM-NEXT: retq # sched: [4:1.00] 1669; 1670; SLM-NOOPT-LABEL: test_mul_by_32: 1671; SLM-NOOPT: # %bb.0: 1672; SLM-NOOPT-NEXT: shll $5, %edi # sched: [1:1.00] 1673; SLM-NOOPT-NEXT: movl %edi, %eax # sched: [1:0.50] 1674; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1675 %mul = mul nsw i32 %x, 32 1676 ret i32 %mul 1677} 1678 1679define i32 @test_mul_by_37(i32 %x) { 1680; X86-LABEL: test_mul_by_37: 1681; X86: # %bb.0: 1682; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1683; X86-NEXT: leal (%eax,%eax,8), %ecx 1684; X86-NEXT: leal (%eax,%ecx,4), %eax 1685; X86-NEXT: retl 1686; 1687; X64-HSW-LABEL: test_mul_by_37: 1688; X64-HSW: # %bb.0: 1689; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1690; X64-HSW-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:0.50] 1691; X64-HSW-NEXT: leal (%rdi,%rax,4), %eax # sched: [1:0.50] 1692; X64-HSW-NEXT: retq # sched: [7:1.00] 1693; 1694; X64-JAG-LABEL: test_mul_by_37: 1695; X64-JAG: # %bb.0: 1696; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1697; X64-JAG-NEXT: leal (%rdi,%rdi,8), %eax # sched: [2:1.00] 1698; X64-JAG-NEXT: leal (%rdi,%rax,4), %eax # sched: [2:1.00] 1699; X64-JAG-NEXT: retq # sched: [4:1.00] 1700; 1701; X86-NOOPT-LABEL: test_mul_by_37: 1702; X86-NOOPT: # %bb.0: 1703; X86-NOOPT-NEXT: imull $37, {{[0-9]+}}(%esp), %eax 1704; X86-NOOPT-NEXT: retl 1705; 1706; HSW-NOOPT-LABEL: test_mul_by_37: 1707; HSW-NOOPT: # %bb.0: 1708; HSW-NOOPT-NEXT: imull $37, %edi, %eax # sched: [3:1.00] 1709; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1710; 1711; JAG-NOOPT-LABEL: test_mul_by_37: 1712; JAG-NOOPT: # %bb.0: 1713; JAG-NOOPT-NEXT: imull $37, %edi, %eax # sched: [3:1.00] 1714; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1715; 1716; X64-SLM-LABEL: test_mul_by_37: 1717; X64-SLM: # %bb.0: 1718; X64-SLM-NEXT: imull $37, %edi, %eax # sched: [3:1.00] 1719; X64-SLM-NEXT: retq # sched: [4:1.00] 1720; 1721; SLM-NOOPT-LABEL: test_mul_by_37: 1722; SLM-NOOPT: # %bb.0: 1723; SLM-NOOPT-NEXT: imull $37, %edi, %eax # sched: [3:1.00] 1724; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1725 %mul = mul nsw i32 %x, 37 1726 ret i32 %mul 1727} 1728 1729define i32 @test_mul_by_41(i32 %x) { 1730; X86-LABEL: test_mul_by_41: 1731; X86: # %bb.0: 1732; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1733; X86-NEXT: leal (%eax,%eax,4), %ecx 1734; X86-NEXT: leal (%eax,%ecx,8), %eax 1735; X86-NEXT: retl 1736; 1737; X64-HSW-LABEL: test_mul_by_41: 1738; X64-HSW: # %bb.0: 1739; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1740; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 1741; X64-HSW-NEXT: leal (%rdi,%rax,8), %eax # sched: [1:0.50] 1742; X64-HSW-NEXT: retq # sched: [7:1.00] 1743; 1744; X64-JAG-LABEL: test_mul_by_41: 1745; X64-JAG: # %bb.0: 1746; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1747; X64-JAG-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00] 1748; X64-JAG-NEXT: leal (%rdi,%rax,8), %eax # sched: [2:1.00] 1749; X64-JAG-NEXT: retq # sched: [4:1.00] 1750; 1751; X86-NOOPT-LABEL: test_mul_by_41: 1752; X86-NOOPT: # %bb.0: 1753; X86-NOOPT-NEXT: imull $41, {{[0-9]+}}(%esp), %eax 1754; X86-NOOPT-NEXT: retl 1755; 1756; HSW-NOOPT-LABEL: test_mul_by_41: 1757; HSW-NOOPT: # %bb.0: 1758; HSW-NOOPT-NEXT: imull $41, %edi, %eax # sched: [3:1.00] 1759; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1760; 1761; JAG-NOOPT-LABEL: test_mul_by_41: 1762; JAG-NOOPT: # %bb.0: 1763; JAG-NOOPT-NEXT: imull $41, %edi, %eax # sched: [3:1.00] 1764; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1765; 1766; X64-SLM-LABEL: test_mul_by_41: 1767; X64-SLM: # %bb.0: 1768; X64-SLM-NEXT: imull $41, %edi, %eax # sched: [3:1.00] 1769; X64-SLM-NEXT: retq # sched: [4:1.00] 1770; 1771; SLM-NOOPT-LABEL: test_mul_by_41: 1772; SLM-NOOPT: # %bb.0: 1773; SLM-NOOPT-NEXT: imull $41, %edi, %eax # sched: [3:1.00] 1774; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1775 %mul = mul nsw i32 %x, 41 1776 ret i32 %mul 1777} 1778 1779define i32 @test_mul_by_62(i32 %x) { 1780; X86-LABEL: test_mul_by_62: 1781; X86: # %bb.0: 1782; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 1783; X86-NEXT: movl %ecx, %eax 1784; X86-NEXT: shll $6, %eax 1785; X86-NEXT: subl %ecx, %eax 1786; X86-NEXT: subl %ecx, %eax 1787; X86-NEXT: retl 1788; 1789; X64-HSW-LABEL: test_mul_by_62: 1790; X64-HSW: # %bb.0: 1791; X64-HSW-NEXT: movl %edi, %eax # sched: [1:0.25] 1792; X64-HSW-NEXT: shll $6, %eax # sched: [1:0.50] 1793; X64-HSW-NEXT: subl %edi, %eax # sched: [1:0.25] 1794; X64-HSW-NEXT: subl %edi, %eax # sched: [1:0.25] 1795; X64-HSW-NEXT: retq # sched: [7:1.00] 1796; 1797; X64-JAG-LABEL: test_mul_by_62: 1798; X64-JAG: # %bb.0: 1799; X64-JAG-NEXT: movl %edi, %eax # sched: [1:0.50] 1800; X64-JAG-NEXT: shll $6, %eax # sched: [1:0.50] 1801; X64-JAG-NEXT: subl %edi, %eax # sched: [1:0.50] 1802; X64-JAG-NEXT: subl %edi, %eax # sched: [1:0.50] 1803; X64-JAG-NEXT: retq # sched: [4:1.00] 1804; 1805; X86-NOOPT-LABEL: test_mul_by_62: 1806; X86-NOOPT: # %bb.0: 1807; X86-NOOPT-NEXT: imull $62, {{[0-9]+}}(%esp), %eax 1808; X86-NOOPT-NEXT: retl 1809; 1810; HSW-NOOPT-LABEL: test_mul_by_62: 1811; HSW-NOOPT: # %bb.0: 1812; HSW-NOOPT-NEXT: imull $62, %edi, %eax # sched: [3:1.00] 1813; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1814; 1815; JAG-NOOPT-LABEL: test_mul_by_62: 1816; JAG-NOOPT: # %bb.0: 1817; JAG-NOOPT-NEXT: imull $62, %edi, %eax # sched: [3:1.00] 1818; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1819; 1820; X64-SLM-LABEL: test_mul_by_62: 1821; X64-SLM: # %bb.0: 1822; X64-SLM-NEXT: movl %edi, %eax # sched: [1:0.50] 1823; X64-SLM-NEXT: shll $6, %eax # sched: [1:1.00] 1824; X64-SLM-NEXT: subl %edi, %eax # sched: [1:0.50] 1825; X64-SLM-NEXT: subl %edi, %eax # sched: [1:0.50] 1826; X64-SLM-NEXT: retq # sched: [4:1.00] 1827; 1828; SLM-NOOPT-LABEL: test_mul_by_62: 1829; SLM-NOOPT: # %bb.0: 1830; SLM-NOOPT-NEXT: imull $62, %edi, %eax # sched: [3:1.00] 1831; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1832 %mul = mul nsw i32 %x, 62 1833 ret i32 %mul 1834} 1835 1836define i32 @test_mul_by_66(i32 %x) { 1837; X86-LABEL: test_mul_by_66: 1838; X86: # %bb.0: 1839; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1840; X86-NEXT: movl %eax, %ecx 1841; X86-NEXT: shll $6, %ecx 1842; X86-NEXT: leal (%ecx,%eax,2), %eax 1843; X86-NEXT: retl 1844; 1845; X64-HSW-LABEL: test_mul_by_66: 1846; X64-HSW: # %bb.0: 1847; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1848; X64-HSW-NEXT: movl %edi, %eax # sched: [1:0.25] 1849; X64-HSW-NEXT: shll $6, %eax # sched: [1:0.50] 1850; X64-HSW-NEXT: leal (%rax,%rdi,2), %eax # sched: [1:0.50] 1851; X64-HSW-NEXT: retq # sched: [7:1.00] 1852; 1853; X64-JAG-LABEL: test_mul_by_66: 1854; X64-JAG: # %bb.0: 1855; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1856; X64-JAG-NEXT: movl %edi, %eax # sched: [1:0.50] 1857; X64-JAG-NEXT: shll $6, %eax # sched: [1:0.50] 1858; X64-JAG-NEXT: leal (%rax,%rdi,2), %eax # sched: [2:1.00] 1859; X64-JAG-NEXT: retq # sched: [4:1.00] 1860; 1861; X86-NOOPT-LABEL: test_mul_by_66: 1862; X86-NOOPT: # %bb.0: 1863; X86-NOOPT-NEXT: imull $66, {{[0-9]+}}(%esp), %eax 1864; X86-NOOPT-NEXT: retl 1865; 1866; HSW-NOOPT-LABEL: test_mul_by_66: 1867; HSW-NOOPT: # %bb.0: 1868; HSW-NOOPT-NEXT: imull $66, %edi, %eax # sched: [3:1.00] 1869; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1870; 1871; JAG-NOOPT-LABEL: test_mul_by_66: 1872; JAG-NOOPT: # %bb.0: 1873; JAG-NOOPT-NEXT: imull $66, %edi, %eax # sched: [3:1.00] 1874; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1875; 1876; X64-SLM-LABEL: test_mul_by_66: 1877; X64-SLM: # %bb.0: 1878; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 1879; X64-SLM-NEXT: movl %edi, %eax # sched: [1:0.50] 1880; X64-SLM-NEXT: shll $6, %eax # sched: [1:1.00] 1881; X64-SLM-NEXT: leal (%rax,%rdi), %eax # sched: [1:1.00] 1882; X64-SLM-NEXT: addl %edi, %eax # sched: [1:0.50] 1883; X64-SLM-NEXT: retq # sched: [4:1.00] 1884; 1885; SLM-NOOPT-LABEL: test_mul_by_66: 1886; SLM-NOOPT: # %bb.0: 1887; SLM-NOOPT-NEXT: imull $66, %edi, %eax # sched: [3:1.00] 1888; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1889 %mul = mul nsw i32 %x, 66 1890 ret i32 %mul 1891} 1892 1893define i32 @test_mul_by_73(i32 %x) { 1894; X86-LABEL: test_mul_by_73: 1895; X86: # %bb.0: 1896; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1897; X86-NEXT: leal (%eax,%eax,8), %ecx 1898; X86-NEXT: leal (%eax,%ecx,8), %eax 1899; X86-NEXT: retl 1900; 1901; X64-HSW-LABEL: test_mul_by_73: 1902; X64-HSW: # %bb.0: 1903; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1904; X64-HSW-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:0.50] 1905; X64-HSW-NEXT: leal (%rdi,%rax,8), %eax # sched: [1:0.50] 1906; X64-HSW-NEXT: retq # sched: [7:1.00] 1907; 1908; X64-JAG-LABEL: test_mul_by_73: 1909; X64-JAG: # %bb.0: 1910; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1911; X64-JAG-NEXT: leal (%rdi,%rdi,8), %eax # sched: [2:1.00] 1912; X64-JAG-NEXT: leal (%rdi,%rax,8), %eax # sched: [2:1.00] 1913; X64-JAG-NEXT: retq # sched: [4:1.00] 1914; 1915; X86-NOOPT-LABEL: test_mul_by_73: 1916; X86-NOOPT: # %bb.0: 1917; X86-NOOPT-NEXT: imull $73, {{[0-9]+}}(%esp), %eax 1918; X86-NOOPT-NEXT: retl 1919; 1920; HSW-NOOPT-LABEL: test_mul_by_73: 1921; HSW-NOOPT: # %bb.0: 1922; HSW-NOOPT-NEXT: imull $73, %edi, %eax # sched: [3:1.00] 1923; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1924; 1925; JAG-NOOPT-LABEL: test_mul_by_73: 1926; JAG-NOOPT: # %bb.0: 1927; JAG-NOOPT-NEXT: imull $73, %edi, %eax # sched: [3:1.00] 1928; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1929; 1930; X64-SLM-LABEL: test_mul_by_73: 1931; X64-SLM: # %bb.0: 1932; X64-SLM-NEXT: imull $73, %edi, %eax # sched: [3:1.00] 1933; X64-SLM-NEXT: retq # sched: [4:1.00] 1934; 1935; SLM-NOOPT-LABEL: test_mul_by_73: 1936; SLM-NOOPT: # %bb.0: 1937; SLM-NOOPT-NEXT: imull $73, %edi, %eax # sched: [3:1.00] 1938; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1939 %mul = mul nsw i32 %x, 73 1940 ret i32 %mul 1941} 1942 1943define i32 @test_mul_by_520(i32 %x) { 1944; X86-LABEL: test_mul_by_520: 1945; X86: # %bb.0: 1946; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 1947; X86-NEXT: movl %eax, %ecx 1948; X86-NEXT: shll $9, %ecx 1949; X86-NEXT: leal (%ecx,%eax,8), %eax 1950; X86-NEXT: retl 1951; 1952; X64-HSW-LABEL: test_mul_by_520: 1953; X64-HSW: # %bb.0: 1954; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 1955; X64-HSW-NEXT: movl %edi, %eax # sched: [1:0.25] 1956; X64-HSW-NEXT: shll $9, %eax # sched: [1:0.50] 1957; X64-HSW-NEXT: leal (%rax,%rdi,8), %eax # sched: [1:0.50] 1958; X64-HSW-NEXT: retq # sched: [7:1.00] 1959; 1960; X64-JAG-LABEL: test_mul_by_520: 1961; X64-JAG: # %bb.0: 1962; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 1963; X64-JAG-NEXT: movl %edi, %eax # sched: [1:0.50] 1964; X64-JAG-NEXT: shll $9, %eax # sched: [1:0.50] 1965; X64-JAG-NEXT: leal (%rax,%rdi,8), %eax # sched: [2:1.00] 1966; X64-JAG-NEXT: retq # sched: [4:1.00] 1967; 1968; X86-NOOPT-LABEL: test_mul_by_520: 1969; X86-NOOPT: # %bb.0: 1970; X86-NOOPT-NEXT: imull $520, {{[0-9]+}}(%esp), %eax # imm = 0x208 1971; X86-NOOPT-NEXT: retl 1972; 1973; HSW-NOOPT-LABEL: test_mul_by_520: 1974; HSW-NOOPT: # %bb.0: 1975; HSW-NOOPT-NEXT: imull $520, %edi, %eax # imm = 0x208 1976; HSW-NOOPT-NEXT: # sched: [3:1.00] 1977; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 1978; 1979; JAG-NOOPT-LABEL: test_mul_by_520: 1980; JAG-NOOPT: # %bb.0: 1981; JAG-NOOPT-NEXT: imull $520, %edi, %eax # imm = 0x208 1982; JAG-NOOPT-NEXT: # sched: [3:1.00] 1983; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 1984; 1985; X64-SLM-LABEL: test_mul_by_520: 1986; X64-SLM: # %bb.0: 1987; X64-SLM-NEXT: imull $520, %edi, %eax # imm = 0x208 1988; X64-SLM-NEXT: # sched: [3:1.00] 1989; X64-SLM-NEXT: retq # sched: [4:1.00] 1990; 1991; SLM-NOOPT-LABEL: test_mul_by_520: 1992; SLM-NOOPT: # %bb.0: 1993; SLM-NOOPT-NEXT: imull $520, %edi, %eax # imm = 0x208 1994; SLM-NOOPT-NEXT: # sched: [3:1.00] 1995; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 1996 %mul = mul nsw i32 %x, 520 1997 ret i32 %mul 1998} 1999 2000define i32 @test_mul_by_neg10(i32 %x) { 2001; X86-LABEL: test_mul_by_neg10: 2002; X86: # %bb.0: 2003; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 2004; X86-NEXT: addl %eax, %eax 2005; X86-NEXT: leal (%eax,%eax,4), %eax 2006; X86-NEXT: negl %eax 2007; X86-NEXT: retl 2008; 2009; X64-HSW-LABEL: test_mul_by_neg10: 2010; X64-HSW: # %bb.0: 2011; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 2012; X64-HSW-NEXT: addl %edi, %edi # sched: [1:0.25] 2013; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 2014; X64-HSW-NEXT: negl %eax # sched: [1:0.25] 2015; X64-HSW-NEXT: retq # sched: [7:1.00] 2016; 2017; X64-JAG-LABEL: test_mul_by_neg10: 2018; X64-JAG: # %bb.0: 2019; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 2020; X64-JAG-NEXT: addl %edi, %edi # sched: [1:0.50] 2021; X64-JAG-NEXT: leal (%rdi,%rdi,4), %eax # sched: [2:1.00] 2022; X64-JAG-NEXT: negl %eax # sched: [1:0.50] 2023; X64-JAG-NEXT: retq # sched: [4:1.00] 2024; 2025; X86-NOOPT-LABEL: test_mul_by_neg10: 2026; X86-NOOPT: # %bb.0: 2027; X86-NOOPT-NEXT: imull $-10, {{[0-9]+}}(%esp), %eax 2028; X86-NOOPT-NEXT: retl 2029; 2030; HSW-NOOPT-LABEL: test_mul_by_neg10: 2031; HSW-NOOPT: # %bb.0: 2032; HSW-NOOPT-NEXT: imull $-10, %edi, %eax # sched: [3:1.00] 2033; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 2034; 2035; JAG-NOOPT-LABEL: test_mul_by_neg10: 2036; JAG-NOOPT: # %bb.0: 2037; JAG-NOOPT-NEXT: imull $-10, %edi, %eax # sched: [3:1.00] 2038; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 2039; 2040; X64-SLM-LABEL: test_mul_by_neg10: 2041; X64-SLM: # %bb.0: 2042; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 2043; X64-SLM-NEXT: addl %edi, %edi # sched: [1:0.50] 2044; X64-SLM-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:1.00] 2045; X64-SLM-NEXT: negl %eax # sched: [1:0.50] 2046; X64-SLM-NEXT: retq # sched: [4:1.00] 2047; 2048; SLM-NOOPT-LABEL: test_mul_by_neg10: 2049; SLM-NOOPT: # %bb.0: 2050; SLM-NOOPT-NEXT: imull $-10, %edi, %eax # sched: [3:1.00] 2051; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 2052 %mul = mul nsw i32 %x, -10 2053 ret i32 %mul 2054} 2055 2056define i32 @test_mul_by_neg36(i32 %x) { 2057; X86-LABEL: test_mul_by_neg36: 2058; X86: # %bb.0: 2059; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 2060; X86-NEXT: shll $2, %eax 2061; X86-NEXT: leal (%eax,%eax,8), %eax 2062; X86-NEXT: negl %eax 2063; X86-NEXT: retl 2064; 2065; X64-HSW-LABEL: test_mul_by_neg36: 2066; X64-HSW: # %bb.0: 2067; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 2068; X64-HSW-NEXT: shll $2, %edi # sched: [1:0.50] 2069; X64-HSW-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:0.50] 2070; X64-HSW-NEXT: negl %eax # sched: [1:0.25] 2071; X64-HSW-NEXT: retq # sched: [7:1.00] 2072; 2073; X64-JAG-LABEL: test_mul_by_neg36: 2074; X64-JAG: # %bb.0: 2075; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 2076; X64-JAG-NEXT: shll $2, %edi # sched: [1:0.50] 2077; X64-JAG-NEXT: leal (%rdi,%rdi,8), %eax # sched: [2:1.00] 2078; X64-JAG-NEXT: negl %eax # sched: [1:0.50] 2079; X64-JAG-NEXT: retq # sched: [4:1.00] 2080; 2081; X86-NOOPT-LABEL: test_mul_by_neg36: 2082; X86-NOOPT: # %bb.0: 2083; X86-NOOPT-NEXT: imull $-36, {{[0-9]+}}(%esp), %eax 2084; X86-NOOPT-NEXT: retl 2085; 2086; HSW-NOOPT-LABEL: test_mul_by_neg36: 2087; HSW-NOOPT: # %bb.0: 2088; HSW-NOOPT-NEXT: imull $-36, %edi, %eax # sched: [3:1.00] 2089; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 2090; 2091; JAG-NOOPT-LABEL: test_mul_by_neg36: 2092; JAG-NOOPT: # %bb.0: 2093; JAG-NOOPT-NEXT: imull $-36, %edi, %eax # sched: [3:1.00] 2094; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 2095; 2096; X64-SLM-LABEL: test_mul_by_neg36: 2097; X64-SLM: # %bb.0: 2098; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 2099; X64-SLM-NEXT: shll $2, %edi # sched: [1:1.00] 2100; X64-SLM-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:1.00] 2101; X64-SLM-NEXT: negl %eax # sched: [1:0.50] 2102; X64-SLM-NEXT: retq # sched: [4:1.00] 2103; 2104; SLM-NOOPT-LABEL: test_mul_by_neg36: 2105; SLM-NOOPT: # %bb.0: 2106; SLM-NOOPT-NEXT: imull $-36, %edi, %eax # sched: [3:1.00] 2107; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 2108 %mul = mul nsw i32 %x, -36 2109 ret i32 %mul 2110} 2111 2112; (x*9+42)*(x*5+2) 2113define i32 @test_mul_spec(i32 %x) nounwind { 2114; X86-LABEL: test_mul_spec: 2115; X86: # %bb.0: 2116; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 2117; X86-NEXT: leal 42(%eax,%eax,8), %ecx 2118; X86-NEXT: leal 2(%eax,%eax,4), %eax 2119; X86-NEXT: imull %ecx, %eax 2120; X86-NEXT: retl 2121; 2122; X64-HSW-LABEL: test_mul_spec: 2123; X64-HSW: # %bb.0: 2124; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 2125; X64-HSW-NEXT: leal (%rdi,%rdi,8), %ecx # sched: [1:0.50] 2126; X64-HSW-NEXT: addl $42, %ecx # sched: [1:0.25] 2127; X64-HSW-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 2128; X64-HSW-NEXT: addl $2, %eax # sched: [1:0.25] 2129; X64-HSW-NEXT: imull %ecx, %eax # sched: [3:1.00] 2130; X64-HSW-NEXT: retq # sched: [7:1.00] 2131; 2132; X64-JAG-LABEL: test_mul_spec: 2133; X64-JAG: # %bb.0: 2134; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 2135; X64-JAG-NEXT: leal 42(%rdi,%rdi,8), %ecx # sched: [2:1.00] 2136; X64-JAG-NEXT: leal 2(%rdi,%rdi,4), %eax # sched: [2:1.00] 2137; X64-JAG-NEXT: imull %ecx, %eax # sched: [3:1.00] 2138; X64-JAG-NEXT: retq # sched: [4:1.00] 2139; 2140; X86-NOOPT-LABEL: test_mul_spec: 2141; X86-NOOPT: # %bb.0: 2142; X86-NOOPT-NEXT: movl {{[0-9]+}}(%esp), %eax 2143; X86-NOOPT-NEXT: leal 42(%eax,%eax,8), %ecx 2144; X86-NOOPT-NEXT: leal 2(%eax,%eax,4), %eax 2145; X86-NOOPT-NEXT: imull %ecx, %eax 2146; X86-NOOPT-NEXT: retl 2147; 2148; HSW-NOOPT-LABEL: test_mul_spec: 2149; HSW-NOOPT: # %bb.0: 2150; HSW-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 2151; HSW-NOOPT-NEXT: leal (%rdi,%rdi,8), %ecx # sched: [1:0.50] 2152; HSW-NOOPT-NEXT: addl $42, %ecx # sched: [1:0.25] 2153; HSW-NOOPT-NEXT: leal (%rdi,%rdi,4), %eax # sched: [1:0.50] 2154; HSW-NOOPT-NEXT: addl $2, %eax # sched: [1:0.25] 2155; HSW-NOOPT-NEXT: imull %ecx, %eax # sched: [3:1.00] 2156; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 2157; 2158; JAG-NOOPT-LABEL: test_mul_spec: 2159; JAG-NOOPT: # %bb.0: 2160; JAG-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 2161; JAG-NOOPT-NEXT: leal 42(%rdi,%rdi,8), %ecx # sched: [2:1.00] 2162; JAG-NOOPT-NEXT: leal 2(%rdi,%rdi,4), %eax # sched: [2:1.00] 2163; JAG-NOOPT-NEXT: imull %ecx, %eax # sched: [3:1.00] 2164; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 2165; 2166; X64-SLM-LABEL: test_mul_spec: 2167; X64-SLM: # %bb.0: 2168; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 2169; X64-SLM-NEXT: leal 42(%rdi,%rdi,8), %ecx # sched: [1:1.00] 2170; X64-SLM-NEXT: leal 2(%rdi,%rdi,4), %eax # sched: [1:1.00] 2171; X64-SLM-NEXT: imull %ecx, %eax # sched: [3:1.00] 2172; X64-SLM-NEXT: retq # sched: [4:1.00] 2173; 2174; SLM-NOOPT-LABEL: test_mul_spec: 2175; SLM-NOOPT: # %bb.0: 2176; SLM-NOOPT-NEXT: # kill: def $edi killed $edi def $rdi 2177; SLM-NOOPT-NEXT: leal 42(%rdi,%rdi,8), %ecx # sched: [1:1.00] 2178; SLM-NOOPT-NEXT: leal 2(%rdi,%rdi,4), %eax # sched: [1:1.00] 2179; SLM-NOOPT-NEXT: imull %ecx, %eax # sched: [3:1.00] 2180; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 2181 %mul = mul nsw i32 %x, 9 2182 %add = add nsw i32 %mul, 42 2183 %mul2 = mul nsw i32 %x, 5 2184 %add2 = add nsw i32 %mul2, 2 2185 %mul3 = mul nsw i32 %add, %add2 2186 ret i32 %mul3 2187} 2188 2189; This makes sure we are able to fold the negate generated by the mul expansion 2190; into the next instruction. 2191; FIXME: We make this work. 2192define i32 @mul_neg_fold(i32 %a, i32 %b) { 2193; X86-LABEL: mul_neg_fold: 2194; X86: # %bb.0: 2195; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 2196; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 2197; X86-NEXT: leal (%ecx,%ecx,8), %ecx 2198; X86-NEXT: subl %ecx, %eax 2199; X86-NEXT: retl 2200; 2201; X64-HSW-LABEL: mul_neg_fold: 2202; X64-HSW: # %bb.0: 2203; X64-HSW-NEXT: # kill: def $edi killed $edi def $rdi 2204; X64-HSW-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:0.50] 2205; X64-HSW-NEXT: subl %eax, %esi # sched: [1:0.25] 2206; X64-HSW-NEXT: movl %esi, %eax # sched: [1:0.25] 2207; X64-HSW-NEXT: retq # sched: [7:1.00] 2208; 2209; X64-JAG-LABEL: mul_neg_fold: 2210; X64-JAG: # %bb.0: 2211; X64-JAG-NEXT: # kill: def $edi killed $edi def $rdi 2212; X64-JAG-NEXT: leal (%rdi,%rdi,8), %eax # sched: [2:1.00] 2213; X64-JAG-NEXT: subl %eax, %esi # sched: [1:0.50] 2214; X64-JAG-NEXT: movl %esi, %eax # sched: [1:0.50] 2215; X64-JAG-NEXT: retq # sched: [4:1.00] 2216; 2217; X86-NOOPT-LABEL: mul_neg_fold: 2218; X86-NOOPT: # %bb.0: 2219; X86-NOOPT-NEXT: imull $-9, {{[0-9]+}}(%esp), %eax 2220; X86-NOOPT-NEXT: addl {{[0-9]+}}(%esp), %eax 2221; X86-NOOPT-NEXT: retl 2222; 2223; HSW-NOOPT-LABEL: mul_neg_fold: 2224; HSW-NOOPT: # %bb.0: 2225; HSW-NOOPT-NEXT: imull $-9, %edi, %eax # sched: [3:1.00] 2226; HSW-NOOPT-NEXT: addl %esi, %eax # sched: [1:0.25] 2227; HSW-NOOPT-NEXT: retq # sched: [7:1.00] 2228; 2229; JAG-NOOPT-LABEL: mul_neg_fold: 2230; JAG-NOOPT: # %bb.0: 2231; JAG-NOOPT-NEXT: imull $-9, %edi, %eax # sched: [3:1.00] 2232; JAG-NOOPT-NEXT: addl %esi, %eax # sched: [1:0.50] 2233; JAG-NOOPT-NEXT: retq # sched: [4:1.00] 2234; 2235; X64-SLM-LABEL: mul_neg_fold: 2236; X64-SLM: # %bb.0: 2237; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi 2238; X64-SLM-NEXT: leal (%rdi,%rdi,8), %eax # sched: [1:1.00] 2239; X64-SLM-NEXT: subl %eax, %esi # sched: [1:0.50] 2240; X64-SLM-NEXT: movl %esi, %eax # sched: [1:0.50] 2241; X64-SLM-NEXT: retq # sched: [4:1.00] 2242; 2243; SLM-NOOPT-LABEL: mul_neg_fold: 2244; SLM-NOOPT: # %bb.0: 2245; SLM-NOOPT-NEXT: imull $-9, %edi, %eax # sched: [3:1.00] 2246; SLM-NOOPT-NEXT: addl %esi, %eax # sched: [1:0.50] 2247; SLM-NOOPT-NEXT: retq # sched: [4:1.00] 2248 %c = mul i32 %a, -9 2249 %d = add i32 %b, %c 2250 ret i32 %d 2251} 2252