diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -47360,19 +47360,21 @@ else NewMul = DAG.getNode(ISD::SUB, DL, VT, NewMul, N->getOperand(0)); } else if (SignMulAmt >= 0 && isPowerOf2_64(AbsMulAmt - 2)) { - // (mul x, 2^N + 2) => (add (add (shl x, N), x), x) + // (mul x, 2^N + 2) => (add (shl x, N), (add x, x)) NewMul = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0), DAG.getConstant(Log2_64(AbsMulAmt - 2), DL, MVT::i8)); - NewMul = DAG.getNode(ISD::ADD, DL, VT, NewMul, N->getOperand(0)); - NewMul = DAG.getNode(ISD::ADD, DL, VT, NewMul, N->getOperand(0)); + NewMul = DAG.getNode( + ISD::ADD, DL, VT, NewMul, + DAG.getNode(ISD::ADD, DL, VT, N->getOperand(0), N->getOperand(0))); } else if (SignMulAmt >= 0 && isPowerOf2_64(AbsMulAmt + 2)) { - // (mul x, 2^N - 2) => (sub (sub (shl x, N), x), x) + // (mul x, 2^N - 2) => (sub (shl x, N), (add x, x)) NewMul = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0), DAG.getConstant(Log2_64(AbsMulAmt + 2), DL, MVT::i8)); - NewMul = DAG.getNode(ISD::SUB, DL, VT, NewMul, N->getOperand(0)); - NewMul = DAG.getNode(ISD::SUB, DL, VT, NewMul, N->getOperand(0)); + NewMul = DAG.getNode( + ISD::SUB, DL, VT, NewMul, + DAG.getNode(ISD::ADD, DL, VT, N->getOperand(0), N->getOperand(0))); } } diff --git a/llvm/test/CodeGen/X86/mul-constant-i16.ll b/llvm/test/CodeGen/X86/mul-constant-i16.ll --- a/llvm/test/CodeGen/X86/mul-constant-i16.ll +++ b/llvm/test/CodeGen/X86/mul-constant-i16.ll @@ -248,21 +248,20 @@ define i16 @test_mul_by_14(i16 %x) { ; X86-LABEL: test_mul_by_14: ; X86: # %bb.0: -; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: movl %ecx, %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-NEXT: leal (%eax,%eax), %ecx ; X86-NEXT: shll $4, %eax ; X86-NEXT: subl %ecx, %eax -; X86-NEXT: subl %ecx, %eax ; X86-NEXT: # kill: def $ax killed $ax killed $eax ; X86-NEXT: retl ; ; X64-LABEL: test_mul_by_14: ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax +; X64-NEXT: leal (%rax,%rax), %ecx ; X64-NEXT: shll $4, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: # kill: def $ax killed $ax killed $eax +; X64-NEXT: subl %ecx, %eax +; X64-NEXT: # kill: def $ax killed $ax killed $rax ; X64-NEXT: retq %mul = mul nsw i16 %x, 14 ret i16 %mul @@ -582,21 +581,20 @@ define i16 @test_mul_by_30(i16 %x) { ; X86-LABEL: test_mul_by_30: ; X86: # %bb.0: -; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: movl %ecx, %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-NEXT: leal (%eax,%eax), %ecx ; X86-NEXT: shll $5, %eax ; X86-NEXT: subl %ecx, %eax -; X86-NEXT: subl %ecx, %eax ; X86-NEXT: # kill: def $ax killed $ax killed $eax ; X86-NEXT: retl ; ; X64-LABEL: test_mul_by_30: ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax +; X64-NEXT: leal (%rax,%rax), %ecx ; X64-NEXT: shll $5, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: # kill: def $ax killed $ax killed $eax +; X64-NEXT: subl %ecx, %eax +; X64-NEXT: # kill: def $ax killed $ax killed $rax ; X64-NEXT: retq %mul = mul nsw i16 %x, 30 ret i16 %mul @@ -684,21 +682,20 @@ define i16 @test_mul_by_62(i16 %x) { ; X86-LABEL: test_mul_by_62: ; X86: # %bb.0: -; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: movl %ecx, %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-NEXT: leal (%eax,%eax), %ecx ; X86-NEXT: shll $6, %eax ; X86-NEXT: subl %ecx, %eax -; X86-NEXT: subl %ecx, %eax ; X86-NEXT: # kill: def $ax killed $ax killed $eax ; X86-NEXT: retl ; ; X64-LABEL: test_mul_by_62: ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax +; X64-NEXT: leal (%rax,%rax), %ecx ; X64-NEXT: shll $6, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: # kill: def $ax killed $ax killed $eax +; X64-NEXT: subl %ecx, %eax +; X64-NEXT: # kill: def $ax killed $ax killed $rax ; X64-NEXT: retq %mul = mul nsw i16 %x, 62 ret i16 %mul diff --git a/llvm/test/CodeGen/X86/mul-constant-i32.ll b/llvm/test/CodeGen/X86/mul-constant-i32.ll --- a/llvm/test/CodeGen/X86/mul-constant-i32.ll +++ b/llvm/test/CodeGen/X86/mul-constant-i32.ll @@ -392,19 +392,19 @@ define i32 @test_mul_by_14(i32 %x) { ; X86-LABEL: test_mul_by_14: ; X86: # %bb.0: -; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: movl %ecx, %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-NEXT: leal (%eax,%eax), %ecx ; X86-NEXT: shll $4, %eax ; X86-NEXT: subl %ecx, %eax -; X86-NEXT: subl %ecx, %eax ; X86-NEXT: retl ; ; X64-LABEL: test_mul_by_14: ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax +; X64-NEXT: leal (%rax,%rax), %ecx ; X64-NEXT: shll $4, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: subl %edi, %eax +; X64-NEXT: subl %ecx, %eax +; X64-NEXT: # kill: def $eax killed $eax killed $rax ; X64-NEXT: retq ; ; X86-NOOPT-LABEL: test_mul_by_14: @@ -946,19 +946,19 @@ define i32 @test_mul_by_30(i32 %x) { ; X86-LABEL: test_mul_by_30: ; X86: # %bb.0: -; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: movl %ecx, %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-NEXT: leal (%eax,%eax), %ecx ; X86-NEXT: shll $5, %eax ; X86-NEXT: subl %ecx, %eax -; X86-NEXT: subl %ecx, %eax ; X86-NEXT: retl ; ; X64-LABEL: test_mul_by_30: ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax +; X64-NEXT: leal (%rax,%rax), %ecx ; X64-NEXT: shll $5, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: subl %edi, %eax +; X64-NEXT: subl %ecx, %eax +; X64-NEXT: # kill: def $eax killed $eax killed $rax ; X64-NEXT: retq ; ; X86-NOOPT-LABEL: test_mul_by_30: @@ -1114,19 +1114,19 @@ define i32 @test_mul_by_62(i32 %x) { ; X86-LABEL: test_mul_by_62: ; X86: # %bb.0: -; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-NEXT: movl %ecx, %eax +; X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-NEXT: leal (%eax,%eax), %ecx ; X86-NEXT: shll $6, %eax ; X86-NEXT: subl %ecx, %eax -; X86-NEXT: subl %ecx, %eax ; X86-NEXT: retl ; ; X64-LABEL: test_mul_by_62: ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax +; X64-NEXT: leal (%rax,%rax), %ecx ; X64-NEXT: shll $6, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: subl %edi, %eax +; X64-NEXT: subl %ecx, %eax +; X64-NEXT: # kill: def $eax killed $eax killed $rax ; X64-NEXT: retq ; ; X86-NOOPT-LABEL: test_mul_by_62: @@ -1180,9 +1180,8 @@ ; X64-SLM-LABEL: test_mul_by_66: ; X64-SLM: # %bb.0: ; X64-SLM-NEXT: # kill: def $edi killed $edi def $rdi -; X64-SLM-NEXT: movl %edi, %eax -; X64-SLM-NEXT: shll $6, %eax -; X64-SLM-NEXT: addl %edi, %eax +; X64-SLM-NEXT: leal (%rdi,%rdi), %eax +; X64-SLM-NEXT: shll $6, %edi ; X64-SLM-NEXT: addl %edi, %eax ; X64-SLM-NEXT: retq %mul = mul nsw i32 %x, 66 diff --git a/llvm/test/CodeGen/X86/mul-constant-i64.ll b/llvm/test/CodeGen/X86/mul-constant-i64.ll --- a/llvm/test/CodeGen/X86/mul-constant-i64.ll +++ b/llvm/test/CodeGen/X86/mul-constant-i64.ll @@ -402,11 +402,10 @@ define i64 @test_mul_by_14(i64 %x) { ; X86-LABEL: test_mul_by_14: ; X86: # %bb.0: -; X86-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl %eax, %ecx +; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT: leal (%ecx,%ecx), %eax ; X86-NEXT: shll $4, %ecx ; X86-NEXT: subl %eax, %ecx -; X86-NEXT: subl %eax, %ecx ; X86-NEXT: movl $14, %eax ; X86-NEXT: mull {{[0-9]+}}(%esp) ; X86-NEXT: addl %ecx, %edx @@ -1046,11 +1045,10 @@ define i64 @test_mul_by_30(i64 %x) { ; X86-LABEL: test_mul_by_30: ; X86: # %bb.0: -; X86-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl %eax, %ecx +; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT: leal (%ecx,%ecx), %eax ; X86-NEXT: shll $5, %ecx ; X86-NEXT: subl %eax, %ecx -; X86-NEXT: subl %eax, %ecx ; X86-NEXT: movl $30, %eax ; X86-NEXT: mull {{[0-9]+}}(%esp) ; X86-NEXT: addl %ecx, %edx @@ -1232,11 +1230,10 @@ define i64 @test_mul_by_62(i64 %x) { ; X86-LABEL: test_mul_by_62: ; X86: # %bb.0: -; X86-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-NEXT: movl %eax, %ecx +; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-NEXT: leal (%ecx,%ecx), %eax ; X86-NEXT: shll $6, %ecx ; X86-NEXT: subl %eax, %ecx -; X86-NEXT: subl %eax, %ecx ; X86-NEXT: movl $62, %eax ; X86-NEXT: mull {{[0-9]+}}(%esp) ; X86-NEXT: addl %ecx, %edx @@ -1302,9 +1299,8 @@ ; ; X64-SLM-LABEL: test_mul_by_66: ; X64-SLM: # %bb.0: -; X64-SLM-NEXT: movq %rdi, %rax -; X64-SLM-NEXT: shlq $6, %rax -; X64-SLM-NEXT: addq %rdi, %rax +; X64-SLM-NEXT: leaq (%rdi,%rdi), %rax +; X64-SLM-NEXT: shlq $6, %rdi ; X64-SLM-NEXT: addq %rdi, %rax ; X64-SLM-NEXT: retq ; diff --git a/llvm/test/CodeGen/X86/mul-constant-i8.ll b/llvm/test/CodeGen/X86/mul-constant-i8.ll --- a/llvm/test/CodeGen/X86/mul-constant-i8.ll +++ b/llvm/test/CodeGen/X86/mul-constant-i8.ll @@ -153,10 +153,10 @@ ; X64-LABEL: test_mul_by_14: ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax +; X64-NEXT: leal (%rax,%rax), %ecx ; X64-NEXT: shll $4, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: # kill: def $al killed $al killed $eax +; X64-NEXT: subl %ecx, %eax +; X64-NEXT: # kill: def $al killed $al killed $rax ; X64-NEXT: retq %m = mul i8 %x, 14 ret i8 %m @@ -351,10 +351,10 @@ ; X64-LABEL: test_mul_by_30: ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax +; X64-NEXT: leal (%rax,%rax), %ecx ; X64-NEXT: shll $5, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: # kill: def $al killed $al killed $eax +; X64-NEXT: subl %ecx, %eax +; X64-NEXT: # kill: def $al killed $al killed $rax ; X64-NEXT: retq %m = mul i8 %x, 30 ret i8 %m @@ -411,10 +411,10 @@ ; X64-LABEL: test_mul_by_62: ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax +; X64-NEXT: leal (%rax,%rax), %ecx ; X64-NEXT: shll $6, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: subl %edi, %eax -; X64-NEXT: # kill: def $al killed $al killed $eax +; X64-NEXT: subl %ecx, %eax +; X64-NEXT: # kill: def $al killed $al killed $rax ; X64-NEXT: retq %m = mul i8 %x, 62 ret i8 %m diff --git a/llvm/test/CodeGen/X86/mul-constant-result.ll b/llvm/test/CodeGen/X86/mul-constant-result.ll --- a/llvm/test/CodeGen/X86/mul-constant-result.ll +++ b/llvm/test/CodeGen/X86/mul-constant-result.ll @@ -55,7 +55,7 @@ ; X86-NEXT: jmp .LBB0_9 ; X86-NEXT: .LBB0_13: ; X86-NEXT: leal (,%eax,8), %ecx -; X86-NEXT: jmp .LBB0_41 +; X86-NEXT: jmp .LBB0_42 ; X86-NEXT: .LBB0_14: ; X86-NEXT: shll $3, %eax ; X86-NEXT: popl %esi @@ -75,31 +75,30 @@ ; X86-NEXT: leal (%eax,%eax,2), %ecx ; X86-NEXT: jmp .LBB0_21 ; X86-NEXT: .LBB0_22: -; X86-NEXT: movl %eax, %ecx -; X86-NEXT: shll $4, %ecx -; X86-NEXT: subl %eax, %ecx -; X86-NEXT: jmp .LBB0_41 -; X86-NEXT: .LBB0_23: +; X86-NEXT: leal (%eax,%eax), %ecx +; X86-NEXT: shll $4, %eax +; X86-NEXT: jmp .LBB0_23 +; X86-NEXT: .LBB0_24: ; X86-NEXT: leal (%eax,%eax,4), %eax ; X86-NEXT: jmp .LBB0_9 -; X86-NEXT: .LBB0_24: +; X86-NEXT: .LBB0_25: ; X86-NEXT: shll $4, %eax ; X86-NEXT: popl %esi ; X86-NEXT: .cfi_def_cfa_offset 4 ; X86-NEXT: retl -; X86-NEXT: .LBB0_25: +; X86-NEXT: .LBB0_26: ; X86-NEXT: .cfi_def_cfa_offset 8 ; X86-NEXT: movl %eax, %ecx ; X86-NEXT: shll $4, %ecx -; X86-NEXT: jmp .LBB0_26 -; X86-NEXT: .LBB0_27: +; X86-NEXT: jmp .LBB0_27 +; X86-NEXT: .LBB0_28: ; X86-NEXT: addl %eax, %eax ; X86-NEXT: .LBB0_15: ; X86-NEXT: leal (%eax,%eax,8), %eax ; X86-NEXT: popl %esi ; X86-NEXT: .cfi_def_cfa_offset 4 ; X86-NEXT: retl -; X86-NEXT: .LBB0_28: +; X86-NEXT: .LBB0_29: ; X86-NEXT: .cfi_def_cfa_offset 8 ; X86-NEXT: leal (%eax,%eax,8), %ecx ; X86-NEXT: .LBB0_18: @@ -107,78 +106,82 @@ ; X86-NEXT: popl %esi ; X86-NEXT: .cfi_def_cfa_offset 4 ; X86-NEXT: retl -; X86-NEXT: .LBB0_29: +; X86-NEXT: .LBB0_30: ; X86-NEXT: .cfi_def_cfa_offset 8 ; X86-NEXT: shll $2, %eax ; X86-NEXT: jmp .LBB0_11 -; X86-NEXT: .LBB0_30: +; X86-NEXT: .LBB0_31: ; X86-NEXT: leal (%eax,%eax,4), %ecx ; X86-NEXT: .LBB0_21: ; X86-NEXT: leal (%eax,%ecx,4), %eax ; X86-NEXT: popl %esi ; X86-NEXT: .cfi_def_cfa_offset 4 ; X86-NEXT: retl -; X86-NEXT: .LBB0_31: +; X86-NEXT: .LBB0_32: ; X86-NEXT: .cfi_def_cfa_offset 8 ; X86-NEXT: leal (%eax,%eax,4), %ecx ; X86-NEXT: leal (%eax,%ecx,4), %ecx -; X86-NEXT: jmp .LBB0_26 -; X86-NEXT: .LBB0_32: +; X86-NEXT: jmp .LBB0_27 +; X86-NEXT: .LBB0_33: ; X86-NEXT: leal (%eax,%eax,2), %ecx ; X86-NEXT: shll $3, %ecx -; X86-NEXT: jmp .LBB0_41 -; X86-NEXT: .LBB0_33: +; X86-NEXT: jmp .LBB0_42 +; X86-NEXT: .LBB0_34: ; X86-NEXT: shll $3, %eax ; X86-NEXT: jmp .LBB0_9 -; X86-NEXT: .LBB0_34: +; X86-NEXT: .LBB0_35: ; X86-NEXT: leal (%eax,%eax,4), %eax ; X86-NEXT: .LBB0_11: ; X86-NEXT: leal (%eax,%eax,4), %eax ; X86-NEXT: popl %esi ; X86-NEXT: .cfi_def_cfa_offset 4 ; X86-NEXT: retl -; X86-NEXT: .LBB0_35: +; X86-NEXT: .LBB0_36: ; X86-NEXT: .cfi_def_cfa_offset 8 ; X86-NEXT: leal (%eax,%eax,4), %ecx ; X86-NEXT: leal (%ecx,%ecx,4), %ecx -; X86-NEXT: jmp .LBB0_26 -; X86-NEXT: .LBB0_36: +; X86-NEXT: jmp .LBB0_27 +; X86-NEXT: .LBB0_37: ; X86-NEXT: leal (%eax,%eax,8), %eax ; X86-NEXT: .LBB0_9: ; X86-NEXT: leal (%eax,%eax,2), %eax ; X86-NEXT: popl %esi ; X86-NEXT: .cfi_def_cfa_offset 4 ; X86-NEXT: retl -; X86-NEXT: .LBB0_37: +; X86-NEXT: .LBB0_38: ; X86-NEXT: .cfi_def_cfa_offset 8 ; X86-NEXT: leal (%eax,%eax,8), %ecx ; X86-NEXT: leal (%ecx,%ecx,2), %ecx -; X86-NEXT: jmp .LBB0_26 -; X86-NEXT: .LBB0_38: +; X86-NEXT: jmp .LBB0_27 +; X86-NEXT: .LBB0_39: ; X86-NEXT: leal (%eax,%eax,8), %ecx ; X86-NEXT: leal (%ecx,%ecx,2), %ecx ; X86-NEXT: addl %eax, %ecx -; X86-NEXT: .LBB0_26: +; X86-NEXT: .LBB0_27: ; X86-NEXT: addl %ecx, %eax ; X86-NEXT: popl %esi ; X86-NEXT: .cfi_def_cfa_offset 4 ; X86-NEXT: retl -; X86-NEXT: .LBB0_39: -; X86-NEXT: .cfi_def_cfa_offset 8 -; X86-NEXT: movl %eax, %ecx -; X86-NEXT: shll $5, %ecx -; X86-NEXT: subl %eax, %ecx -; X86-NEXT: jmp .LBB0_41 ; X86-NEXT: .LBB0_40: +; X86-NEXT: .cfi_def_cfa_offset 8 +; X86-NEXT: leal (%eax,%eax), %ecx +; X86-NEXT: shll $5, %eax +; X86-NEXT: .LBB0_23: +; X86-NEXT: subl %ecx, %eax +; X86-NEXT: popl %esi +; X86-NEXT: .cfi_def_cfa_offset 4 +; X86-NEXT: retl +; X86-NEXT: .LBB0_41: +; X86-NEXT: .cfi_def_cfa_offset 8 ; X86-NEXT: movl %eax, %ecx ; X86-NEXT: shll $5, %ecx -; X86-NEXT: .LBB0_41: +; X86-NEXT: .LBB0_42: ; X86-NEXT: subl %eax, %ecx ; X86-NEXT: movl %ecx, %eax ; X86-NEXT: popl %esi ; X86-NEXT: .cfi_def_cfa_offset 4 ; X86-NEXT: retl -; X86-NEXT: .LBB0_42: +; X86-NEXT: .LBB0_43: ; X86-NEXT: .cfi_def_cfa_offset 8 ; X86-NEXT: shll $5, %eax ; X86-NEXT: popl %esi @@ -220,7 +223,7 @@ ; X64-HSW-NEXT: retq ; X64-HSW-NEXT: .LBB0_9: ; X64-HSW-NEXT: leal (,%rax,8), %ecx -; X64-HSW-NEXT: jmp .LBB0_37 +; X64-HSW-NEXT: jmp .LBB0_38 ; X64-HSW-NEXT: .LBB0_10: ; X64-HSW-NEXT: shll $3, %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax @@ -247,98 +250,100 @@ ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq ; X64-HSW-NEXT: .LBB0_18: -; X64-HSW-NEXT: movl %eax, %ecx -; X64-HSW-NEXT: shll $4, %ecx -; X64-HSW-NEXT: subl %eax, %ecx -; X64-HSW-NEXT: jmp .LBB0_37 -; X64-HSW-NEXT: .LBB0_19: +; X64-HSW-NEXT: leal (%rax,%rax), %ecx +; X64-HSW-NEXT: shll $4, %eax +; X64-HSW-NEXT: subl %ecx, %eax +; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax +; X64-HSW-NEXT: retq +; X64-HSW-NEXT: .LBB0_20: ; X64-HSW-NEXT: leal (%rax,%rax,4), %eax ; X64-HSW-NEXT: leal (%rax,%rax,2), %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq -; X64-HSW-NEXT: .LBB0_20: +; X64-HSW-NEXT: .LBB0_21: ; X64-HSW-NEXT: shll $4, %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq -; X64-HSW-NEXT: .LBB0_21: +; X64-HSW-NEXT: .LBB0_22: ; X64-HSW-NEXT: movl %eax, %ecx ; X64-HSW-NEXT: shll $4, %ecx -; X64-HSW-NEXT: jmp .LBB0_34 -; X64-HSW-NEXT: .LBB0_22: +; X64-HSW-NEXT: jmp .LBB0_35 +; X64-HSW-NEXT: .LBB0_23: ; X64-HSW-NEXT: addl %eax, %eax ; X64-HSW-NEXT: .LBB0_11: ; X64-HSW-NEXT: leal (%rax,%rax,8), %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq -; X64-HSW-NEXT: .LBB0_23: +; X64-HSW-NEXT: .LBB0_24: ; X64-HSW-NEXT: leal (%rax,%rax,8), %ecx ; X64-HSW-NEXT: leal (%rax,%rcx,2), %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq -; X64-HSW-NEXT: .LBB0_24: +; X64-HSW-NEXT: .LBB0_25: ; X64-HSW-NEXT: shll $2, %eax ; X64-HSW-NEXT: leal (%rax,%rax,4), %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq -; X64-HSW-NEXT: .LBB0_25: +; X64-HSW-NEXT: .LBB0_26: ; X64-HSW-NEXT: leal (%rax,%rax,4), %ecx ; X64-HSW-NEXT: leal (%rax,%rcx,4), %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq -; X64-HSW-NEXT: .LBB0_26: +; X64-HSW-NEXT: .LBB0_27: ; X64-HSW-NEXT: leal (%rax,%rax,4), %ecx ; X64-HSW-NEXT: leal (%rax,%rcx,4), %ecx -; X64-HSW-NEXT: jmp .LBB0_34 -; X64-HSW-NEXT: .LBB0_27: +; X64-HSW-NEXT: jmp .LBB0_35 +; X64-HSW-NEXT: .LBB0_28: ; X64-HSW-NEXT: leal (%rax,%rax,2), %ecx ; X64-HSW-NEXT: shll $3, %ecx -; X64-HSW-NEXT: jmp .LBB0_37 -; X64-HSW-NEXT: .LBB0_28: +; X64-HSW-NEXT: jmp .LBB0_38 +; X64-HSW-NEXT: .LBB0_29: ; X64-HSW-NEXT: shll $3, %eax ; X64-HSW-NEXT: leal (%rax,%rax,2), %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq -; X64-HSW-NEXT: .LBB0_29: +; X64-HSW-NEXT: .LBB0_30: ; X64-HSW-NEXT: leal (%rax,%rax,4), %eax ; X64-HSW-NEXT: leal (%rax,%rax,4), %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq -; X64-HSW-NEXT: .LBB0_30: +; X64-HSW-NEXT: .LBB0_31: ; X64-HSW-NEXT: leal (%rax,%rax,4), %ecx ; X64-HSW-NEXT: leal (%rcx,%rcx,4), %ecx -; X64-HSW-NEXT: jmp .LBB0_34 -; X64-HSW-NEXT: .LBB0_31: +; X64-HSW-NEXT: jmp .LBB0_35 +; X64-HSW-NEXT: .LBB0_32: ; X64-HSW-NEXT: leal (%rax,%rax,8), %eax ; X64-HSW-NEXT: leal (%rax,%rax,2), %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq -; X64-HSW-NEXT: .LBB0_32: +; X64-HSW-NEXT: .LBB0_33: ; X64-HSW-NEXT: leal (%rax,%rax,8), %ecx ; X64-HSW-NEXT: leal (%rcx,%rcx,2), %ecx -; X64-HSW-NEXT: jmp .LBB0_34 -; X64-HSW-NEXT: .LBB0_33: +; X64-HSW-NEXT: jmp .LBB0_35 +; X64-HSW-NEXT: .LBB0_34: ; X64-HSW-NEXT: leal (%rax,%rax,8), %ecx ; X64-HSW-NEXT: leal (%rcx,%rcx,2), %ecx ; X64-HSW-NEXT: addl %eax, %ecx -; X64-HSW-NEXT: .LBB0_34: +; X64-HSW-NEXT: .LBB0_35: ; X64-HSW-NEXT: addl %eax, %ecx ; X64-HSW-NEXT: movl %ecx, %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq -; X64-HSW-NEXT: .LBB0_35: -; X64-HSW-NEXT: movl %eax, %ecx -; X64-HSW-NEXT: shll $5, %ecx -; X64-HSW-NEXT: subl %eax, %ecx -; X64-HSW-NEXT: jmp .LBB0_37 ; X64-HSW-NEXT: .LBB0_36: +; X64-HSW-NEXT: leal (%rax,%rax), %ecx +; X64-HSW-NEXT: shll $5, %eax +; X64-HSW-NEXT: subl %ecx, %eax +; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax +; X64-HSW-NEXT: retq +; X64-HSW-NEXT: .LBB0_37: ; X64-HSW-NEXT: movl %eax, %ecx ; X64-HSW-NEXT: shll $5, %ecx -; X64-HSW-NEXT: .LBB0_37: +; X64-HSW-NEXT: .LBB0_38: ; X64-HSW-NEXT: subl %eax, %ecx ; X64-HSW-NEXT: movl %ecx, %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq -; X64-HSW-NEXT: .LBB0_39: +; X64-HSW-NEXT: .LBB0_40: ; X64-HSW-NEXT: shll $5, %eax ; X64-HSW-NEXT: # kill: def $eax killed $eax killed $rax ; X64-HSW-NEXT: retq