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 @@ -3947,12 +3947,14 @@ } // If this is an 8 or 16-bit value, it is really passed promoted to 32 - // bits. Insert an assert[sz]ext to capture this, then truncate to the - // right size. - if (VA.getLocInfo() == CCValAssign::SExt) + // bits and the function is only local linked. Insert an assert[sz]ext to + // capture this, then truncate to the right size. + if (VA.getLocInfo() == CCValAssign::SExt && F.hasLocalLinkage() && + !F.hasAddressTaken()) ArgValue = DAG.getNode(ISD::AssertSext, dl, RegVT, ArgValue, DAG.getValueType(VA.getValVT())); - else if (VA.getLocInfo() == CCValAssign::ZExt) + else if (VA.getLocInfo() == CCValAssign::ZExt && F.hasLocalLinkage() && + !F.hasAddressTaken()) ArgValue = DAG.getNode(ISD::AssertZext, dl, RegVT, ArgValue, DAG.getValueType(VA.getValVT())); else if (VA.getLocInfo() == CCValAssign::BCvt) diff --git a/llvm/test/CodeGen/X86/2012-08-16-setcc.ll b/llvm/test/CodeGen/X86/2012-08-16-setcc.ll --- a/llvm/test/CodeGen/X86/2012-08-16-setcc.ll +++ b/llvm/test/CodeGen/X86/2012-08-16-setcc.ll @@ -6,8 +6,8 @@ define i32 @and_1(i8 zeroext %a, i8 zeroext %b, i32 %x) { ; CHECK-LABEL: and_1: ; CHECK: # %bb.0: -; CHECK-NEXT: movl %edi, %eax -; CHECK-NEXT: andl %esi, %eax +; CHECK-NEXT: xorl %eax, %eax +; CHECK-NEXT: testb %dil, %sil ; CHECK-NEXT: cmovnel %edx, %eax ; CHECK-NEXT: retq %1 = and i8 %b, %a @@ -19,7 +19,7 @@ define zeroext i1 @and_2(i8 zeroext %a, i8 zeroext %b) { ; CHECK-LABEL: and_2: ; CHECK: # %bb.0: -; CHECK-NEXT: testl %edi, %esi +; CHECK-NEXT: testb %dil, %sil ; CHECK-NEXT: setne %al ; CHECK-NEXT: retq %1 = and i8 %b, %a @@ -31,7 +31,7 @@ ; CHECK-LABEL: xor_1: ; CHECK: # %bb.0: ; CHECK-NEXT: xorl %eax, %eax -; CHECK-NEXT: xorl %esi, %edi +; CHECK-NEXT: xorb %dil, %sil ; CHECK-NEXT: cmovnel %edx, %eax ; CHECK-NEXT: retq %1 = xor i8 %b, %a @@ -43,7 +43,7 @@ define zeroext i1 @xor_2(i8 zeroext %a, i8 zeroext %b) { ; CHECK-LABEL: xor_2: ; CHECK: # %bb.0: -; CHECK-NEXT: xorl %esi, %edi +; CHECK-NEXT: xorb %dil, %sil ; CHECK-NEXT: setne %al ; CHECK-NEXT: retq %1 = xor i8 %b, %a diff --git a/llvm/test/CodeGen/X86/addr-mode-matcher-2.ll b/llvm/test/CodeGen/X86/addr-mode-matcher-2.ll --- a/llvm/test/CodeGen/X86/addr-mode-matcher-2.ll +++ b/llvm/test/CodeGen/X86/addr-mode-matcher-2.ll @@ -42,7 +42,7 @@ ; X64-LABEL: foo: ; X64: # %bb.0: ; X64-NEXT: pushq %rax -; X64-NEXT: testl %edi, %edi +; X64-NEXT: testb %dil, %dil ; X64-NEXT: je .LBB0_1 ; X64-NEXT: # %bb.3: ; X64-NEXT: popq %rax diff --git a/llvm/test/CodeGen/X86/and-with-overflow.ll b/llvm/test/CodeGen/X86/and-with-overflow.ll --- a/llvm/test/CodeGen/X86/and-with-overflow.ll +++ b/llvm/test/CodeGen/X86/and-with-overflow.ll @@ -48,6 +48,7 @@ ; X64: # %bb.0: ; X64-NEXT: movl %esi, %eax ; X64-NEXT: andl %edi, %eax +; X64-NEXT: testb %al, %al ; X64-NEXT: cmovel %edi, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq @@ -75,6 +76,7 @@ ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax ; X64-NEXT: andl $-17, %eax +; X64-NEXT: testw %ax, %ax ; X64-NEXT: cmovel %edi, %eax ; X64-NEXT: # kill: def $ax killed $ax killed $eax ; X64-NEXT: retq @@ -101,6 +103,7 @@ ; X64: # %bb.0: ; X64-NEXT: movl %esi, %eax ; X64-NEXT: andl %edi, %eax +; X64-NEXT: testw %ax, %ax ; X64-NEXT: cmovel %edi, %eax ; X64-NEXT: # kill: def $ax killed $ax killed $eax ; X64-NEXT: retq diff --git a/llvm/test/CodeGen/X86/avx512-regcall-NoMask.ll b/llvm/test/CodeGen/X86/avx512-regcall-NoMask.ll --- a/llvm/test/CodeGen/X86/avx512-regcall-NoMask.ll +++ b/llvm/test/CodeGen/X86/avx512-regcall-NoMask.ll @@ -972,7 +972,7 @@ ; X32-NEXT: addl {{[0-9]+}}(%esp), %ebp ; X32-NEXT: imull %ebp, %edi ; X32-NEXT: addl {{[0-9]+}}(%esp), %esi -; X32-NEXT: imull {{[0-9]+}}(%esp), %esi +; X32-NEXT: imull {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload ; X32-NEXT: addl %esi, %edi ; X32-NEXT: addl {{[0-9]+}}(%esp), %edx ; X32-NEXT: imull %eax, %edx @@ -1063,7 +1063,7 @@ ; LINUXOSX64-NEXT: movl %r13d, %ebx ; LINUXOSX64-NEXT: subl %r14d, %ebx ; LINUXOSX64-NEXT: imull %ebp, %ebx -; LINUXOSX64-NEXT: movl 24(%rsp), %ebp +; LINUXOSX64-NEXT: movl {{[0-9]+}}(%rsp), %ebp ; LINUXOSX64-NEXT: addl %edi, %ebx ; LINUXOSX64-NEXT: movl %r15d, %edi ; LINUXOSX64-NEXT: subl %ebp, %edi @@ -1204,6 +1204,7 @@ ; X32-NEXT: movl {{[0-9]+}}(%esp), %ebx ; X32-NEXT: vcvtss2sd %xmm1, %xmm1, %xmm1 ; X32-NEXT: vaddsd %xmm0, %xmm1, %xmm0 +; X32-NEXT: movsbl %al, %eax ; X32-NEXT: vcvtsi2sd %eax, %xmm2, %xmm1 ; X32-NEXT: vaddsd %xmm1, %xmm0, %xmm0 ; X32-NEXT: vcvtsi2sd %ecx, %xmm2, %xmm1 @@ -1212,7 +1213,8 @@ ; X32-NEXT: vpinsrd $1, %edi, %xmm1, %xmm1 ; X32-NEXT: vcvtqq2pd %ymm1, %ymm1 ; X32-NEXT: vaddsd %xmm1, %xmm0, %xmm0 -; X32-NEXT: vcvtsi2sd %esi, %xmm2, %xmm1 +; X32-NEXT: movswl %si, %eax +; X32-NEXT: vcvtsi2sd %eax, %xmm2, %xmm1 ; X32-NEXT: vaddsd %xmm1, %xmm0, %xmm0 ; X32-NEXT: vcvtsi2sdl (%ebx), %xmm2, %xmm1 ; X32-NEXT: vaddsd %xmm1, %xmm0, %xmm0 @@ -1225,13 +1227,15 @@ ; WIN64: # %bb.0: ; WIN64-NEXT: vcvtss2sd %xmm1, %xmm1, %xmm1 ; WIN64-NEXT: vaddsd %xmm0, %xmm1, %xmm0 +; WIN64-NEXT: movsbl %al, %eax ; WIN64-NEXT: vcvtsi2sd %eax, %xmm2, %xmm1 ; WIN64-NEXT: vaddsd %xmm1, %xmm0, %xmm0 ; WIN64-NEXT: vcvtsi2sd %ecx, %xmm2, %xmm1 ; WIN64-NEXT: vaddsd %xmm1, %xmm0, %xmm0 ; WIN64-NEXT: vcvtsi2sd %rdx, %xmm2, %xmm1 ; WIN64-NEXT: vaddsd %xmm1, %xmm0, %xmm0 -; WIN64-NEXT: vcvtsi2sd %edi, %xmm2, %xmm1 +; WIN64-NEXT: movswl %di, %eax +; WIN64-NEXT: vcvtsi2sd %eax, %xmm2, %xmm1 ; WIN64-NEXT: vaddsd %xmm1, %xmm0, %xmm0 ; WIN64-NEXT: vcvtsi2sdl (%rsi), %xmm2, %xmm1 ; WIN64-NEXT: vaddsd %xmm1, %xmm0, %xmm0 @@ -1242,13 +1246,15 @@ ; LINUXOSX64: # %bb.0: ; LINUXOSX64-NEXT: vcvtss2sd %xmm1, %xmm1, %xmm1 ; LINUXOSX64-NEXT: vaddsd %xmm0, %xmm1, %xmm0 +; LINUXOSX64-NEXT: movsbl %al, %eax ; LINUXOSX64-NEXT: vcvtsi2sd %eax, %xmm2, %xmm1 ; LINUXOSX64-NEXT: vaddsd %xmm1, %xmm0, %xmm0 ; LINUXOSX64-NEXT: vcvtsi2sd %ecx, %xmm2, %xmm1 ; LINUXOSX64-NEXT: vaddsd %xmm1, %xmm0, %xmm0 ; LINUXOSX64-NEXT: vcvtsi2sd %rdx, %xmm2, %xmm1 ; LINUXOSX64-NEXT: vaddsd %xmm1, %xmm0, %xmm0 -; LINUXOSX64-NEXT: vcvtsi2sd %edi, %xmm2, %xmm1 +; LINUXOSX64-NEXT: movswl %di, %eax +; LINUXOSX64-NEXT: vcvtsi2sd %eax, %xmm2, %xmm1 ; LINUXOSX64-NEXT: vaddsd %xmm1, %xmm0, %xmm0 ; LINUXOSX64-NEXT: vcvtsi2sdl (%rsi), %xmm2, %xmm1 ; LINUXOSX64-NEXT: vaddsd %xmm1, %xmm0, %xmm0 diff --git a/llvm/test/CodeGen/X86/avx512vl-vec-masked-cmp.ll b/llvm/test/CodeGen/X86/avx512vl-vec-masked-cmp.ll --- a/llvm/test/CodeGen/X86/avx512vl-vec-masked-cmp.ll +++ b/llvm/test/CodeGen/X86/avx512vl-vec-masked-cmp.ll @@ -66,6 +66,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -94,6 +95,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -173,6 +175,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -201,6 +204,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -753,6 +757,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -782,6 +787,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -864,6 +870,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -893,6 +900,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -2400,6 +2408,7 @@ ; NoVLX-NEXT: vpcmpeqd %zmm1, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -2427,6 +2436,7 @@ ; NoVLX-NEXT: vpcmpeqd (%rsi), %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -2481,6 +2491,7 @@ ; NoVLX-NEXT: vpcmpeqd (%rsi){1to16}, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -2558,6 +2569,7 @@ ; NoVLX-NEXT: vpcmpeqd %zmm1, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -2585,6 +2597,7 @@ ; NoVLX-NEXT: vpcmpeqd (%rsi), %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -2639,6 +2652,7 @@ ; NoVLX-NEXT: vpcmpeqd (%rsi){1to16}, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -4870,6 +4884,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -4898,6 +4913,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -4977,6 +4993,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -5005,6 +5022,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -5557,6 +5575,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -5586,6 +5605,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -5668,6 +5688,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -5697,6 +5718,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -7204,6 +7226,7 @@ ; NoVLX-NEXT: vpcmpgtd %zmm1, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -7231,6 +7254,7 @@ ; NoVLX-NEXT: vpcmpgtd (%rsi), %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -7285,6 +7309,7 @@ ; NoVLX-NEXT: vpcmpgtd (%rsi){1to16}, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -7362,6 +7387,7 @@ ; NoVLX-NEXT: vpcmpgtd %zmm1, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -7389,6 +7415,7 @@ ; NoVLX-NEXT: vpcmpgtd (%rsi), %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -7443,6 +7470,7 @@ ; NoVLX-NEXT: vpcmpgtd (%rsi){1to16}, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -9678,6 +9706,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -9708,6 +9737,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -9791,6 +9821,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -9821,6 +9852,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -10401,6 +10433,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -10432,6 +10465,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -10518,6 +10552,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -10549,6 +10584,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -12068,6 +12104,7 @@ ; NoVLX-NEXT: vpcmpnltd %zmm1, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -12095,6 +12132,7 @@ ; NoVLX-NEXT: vpcmpnltd (%rsi), %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -12149,6 +12187,7 @@ ; NoVLX-NEXT: vpcmpnltd (%rsi){1to16}, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -12226,6 +12265,7 @@ ; NoVLX-NEXT: vpcmpnltd %zmm1, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -12253,6 +12293,7 @@ ; NoVLX-NEXT: vpcmpnltd (%rsi), %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -12307,6 +12348,7 @@ ; NoVLX-NEXT: vpcmpnltd (%rsi){1to16}, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -14544,6 +14586,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -14574,6 +14617,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -14659,6 +14703,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -14689,6 +14734,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -15279,6 +15325,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -15310,6 +15357,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -15398,6 +15446,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -15429,6 +15478,7 @@ ; NoVLX-NEXT: vptestmd %zmm0, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -16952,6 +17002,7 @@ ; NoVLX-NEXT: vpcmpltud %zmm1, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -16979,6 +17030,7 @@ ; NoVLX-NEXT: vpcmpltud (%rsi), %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -17033,6 +17085,7 @@ ; NoVLX-NEXT: vpcmpltud (%rsi){1to16}, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -17110,6 +17163,7 @@ ; NoVLX-NEXT: vpcmpltud %zmm1, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -17137,6 +17191,7 @@ ; NoVLX-NEXT: vpcmpltud (%rsi), %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -17191,6 +17246,7 @@ ; NoVLX-NEXT: vpcmpltud (%rsi){1to16}, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -20717,6 +20773,7 @@ ; NoVLX-NEXT: vcmpeqps %zmm1, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -20744,6 +20801,7 @@ ; NoVLX-NEXT: vcmpeqps (%rsi), %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -20772,6 +20830,7 @@ ; NoVLX-NEXT: vcmpeqps (%rsi){1to16}, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -20811,6 +20870,7 @@ ; VLX-NEXT: vcmpleps {sae}, %zmm1, %zmm0, %k0 ; VLX-NEXT: kmovd %k0, %eax ; VLX-NEXT: andl %edi, %eax +; VLX-NEXT: movzwl %ax, %eax ; VLX-NEXT: vzeroupper ; VLX-NEXT: retq ; @@ -20819,6 +20879,7 @@ ; NoVLX-NEXT: vcmpleps {sae}, %zmm1, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -20920,6 +20981,7 @@ ; NoVLX-NEXT: vcmpeqps %zmm1, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -20947,6 +21009,7 @@ ; NoVLX-NEXT: vcmpeqps (%rsi), %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -20975,6 +21038,7 @@ ; NoVLX-NEXT: vcmpeqps (%rsi){1to16}, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: @@ -21014,6 +21078,7 @@ ; VLX-NEXT: vcmpleps {sae}, %zmm1, %zmm0, %k0 ; VLX-NEXT: kmovd %k0, %eax ; VLX-NEXT: andl %edi, %eax +; VLX-NEXT: movzwl %ax, %eax ; VLX-NEXT: vzeroupper ; VLX-NEXT: retq ; @@ -21022,6 +21087,7 @@ ; NoVLX-NEXT: vcmpleps {sae}, %zmm1, %zmm0, %k0 ; NoVLX-NEXT: kmovw %k0, %eax ; NoVLX-NEXT: andl %edi, %eax +; NoVLX-NEXT: movzwl %ax, %eax ; NoVLX-NEXT: vzeroupper ; NoVLX-NEXT: retq entry: diff --git a/llvm/test/CodeGen/X86/bitcast-int-to-vector-bool.ll b/llvm/test/CodeGen/X86/bitcast-int-to-vector-bool.ll --- a/llvm/test/CodeGen/X86/bitcast-int-to-vector-bool.ll +++ b/llvm/test/CodeGen/X86/bitcast-int-to-vector-bool.ll @@ -8,7 +8,8 @@ define <2 x i1> @bitcast_i2_2i1(i2 zeroext %a0) { ; SSE2-SSSE3-LABEL: bitcast_i2_2i1: ; SSE2-SSSE3: # %bb.0: -; SSE2-SSSE3-NEXT: movd %edi, %xmm0 +; SSE2-SSSE3-NEXT: movzbl %dil, %eax +; SSE2-SSSE3-NEXT: movd %eax, %xmm0 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1] ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [1,2] ; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1 @@ -20,7 +21,8 @@ ; ; AVX1-LABEL: bitcast_i2_2i1: ; AVX1: # %bb.0: -; AVX1-NEXT: vmovd %edi, %xmm0 +; AVX1-NEXT: movzbl %dil, %eax +; AVX1-NEXT: vmovd %eax, %xmm0 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2] ; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 @@ -30,7 +32,8 @@ ; ; AVX2-LABEL: bitcast_i2_2i1: ; AVX2: # %bb.0: -; AVX2-NEXT: vmovd %edi, %xmm0 +; AVX2-NEXT: movzbl %dil, %eax +; AVX2-NEXT: vmovd %eax, %xmm0 ; AVX2-NEXT: vpbroadcastq %xmm0, %xmm0 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2] ; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0 @@ -51,7 +54,8 @@ define <4 x i1> @bitcast_i4_4i1(i4 zeroext %a0) { ; SSE2-SSSE3-LABEL: bitcast_i4_4i1: ; SSE2-SSSE3: # %bb.0: -; SSE2-SSSE3-NEXT: movd %edi, %xmm0 +; SSE2-SSSE3-NEXT: movzbl %dil, %eax +; SSE2-SSSE3-NEXT: movd %eax, %xmm0 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0] ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [1,2,4,8] ; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0 @@ -61,7 +65,8 @@ ; ; AVX1-LABEL: bitcast_i4_4i1: ; AVX1: # %bb.0: -; AVX1-NEXT: vmovd %edi, %xmm0 +; AVX1-NEXT: movzbl %dil, %eax +; AVX1-NEXT: vmovd %eax, %xmm0 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0] ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8] ; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 @@ -71,7 +76,8 @@ ; ; AVX2-LABEL: bitcast_i4_4i1: ; AVX2: # %bb.0: -; AVX2-NEXT: vmovd %edi, %xmm0 +; AVX2-NEXT: movzbl %dil, %eax +; AVX2-NEXT: vmovd %eax, %xmm0 ; AVX2-NEXT: vpbroadcastd %xmm0, %xmm0 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [1,2,4,8] ; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0 diff --git a/llvm/test/CodeGen/X86/bool-ext-inc.ll b/llvm/test/CodeGen/X86/bool-ext-inc.ll --- a/llvm/test/CodeGen/X86/bool-ext-inc.ll +++ b/llvm/test/CodeGen/X86/bool-ext-inc.ll @@ -129,9 +129,10 @@ define i32 @assertsext_sub_1(i1 signext %cond, i32 %y) { ; CHECK-LABEL: assertsext_sub_1: ; CHECK: # %bb.0: -; CHECK-NEXT: # kill: def $esi killed $esi def $rsi -; CHECK-NEXT: # kill: def $edi killed $edi def $rdi -; CHECK-NEXT: leal (%rdi,%rsi), %eax +; CHECK-NEXT: movl %esi, %eax +; CHECK-NEXT: movzbl %dil, %ecx +; CHECK-NEXT: andl $1, %ecx +; CHECK-NEXT: subl %ecx, %eax ; CHECK-NEXT: retq %e = zext i1 %cond to i32 %r = sub i32 %y, %e @@ -141,8 +142,9 @@ define i32 @assertsext_add_1(i1 signext %cond, i32 %y) { ; CHECK-LABEL: assertsext_add_1: ; CHECK: # %bb.0: -; CHECK-NEXT: movl %esi, %eax -; CHECK-NEXT: subl %edi, %eax +; CHECK-NEXT: movzbl %dil, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: addl %esi, %eax ; CHECK-NEXT: retq %e = zext i1 %cond to i32 %r = add i32 %e, %y @@ -152,8 +154,9 @@ define i32 @assertsext_add_1_commute(i1 signext %cond, i32 %y) { ; CHECK-LABEL: assertsext_add_1_commute: ; CHECK: # %bb.0: -; CHECK-NEXT: movl %esi, %eax -; CHECK-NEXT: subl %edi, %eax +; CHECK-NEXT: movzbl %dil, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: addl %esi, %eax ; CHECK-NEXT: retq %e = zext i1 %cond to i32 %r = add i32 %y, %e diff --git a/llvm/test/CodeGen/X86/bool-zext.ll b/llvm/test/CodeGen/X86/bool-zext.ll --- a/llvm/test/CodeGen/X86/bool-zext.ll +++ b/llvm/test/CodeGen/X86/bool-zext.ll @@ -2,7 +2,6 @@ ; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s -check-prefix=X32 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s -check-prefix=X64 -; It's not necessary to zero-extend the arg because it is specified 'zeroext'. define void @bar1(i1 zeroext %v1) nounwind ssp { ; X32-LABEL: bar1: ; X32: # %bb.0: @@ -14,6 +13,7 @@ ; ; X64-LABEL: bar1: ; X64: # %bb.0: +; X64-NEXT: movzbl %dil, %edi ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: jmp foo1 # TAILCALL %conv = zext i1 %v1 to i32 @@ -33,6 +33,7 @@ ; ; X64-LABEL: bar2: ; X64: # %bb.0: +; X64-NEXT: movzbl %dil, %edi ; X64-NEXT: xorl %eax, %eax ; X64-NEXT: jmp foo1 # TAILCALL %conv = zext i8 %v1 to i32 diff --git a/llvm/test/CodeGen/X86/callee-extend.ll b/llvm/test/CodeGen/X86/callee-extend.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/callee-extend.ll @@ -0,0 +1,48 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; Ignore the zeroext/signext attribute and always do sign/zero extension in the callee. +; RUN: llc < %s -mtriple=x86_64-unknown-linux | FileCheck %s + +define i64 @calleeu8(i8 noundef zeroext %a) nounwind { +; CHECK-LABEL: calleeu8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: # kill: def $edi killed $edi def $rdi +; CHECK-NEXT: movzbl %dil, %eax +; CHECK-NEXT: retq +entry: + %conv = zext i8 %a to i64 + ret i64 %conv +} + +define i64 @calleeu16(i16 noundef zeroext %a) nounwind { +; CHECK-LABEL: calleeu16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: # kill: def $edi killed $edi def $rdi +; CHECK-NEXT: movzwl %di, %eax +; CHECK-NEXT: retq +entry: + %conv = zext i16 %a to i64 + ret i64 %conv +} + +define i64 @callees8(i8 noundef signext %a) nounwind { +; CHECK-LABEL: callees8: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: # kill: def $edi killed $edi def $rdi +; CHECK-NEXT: movsbq %dil, %rax +; CHECK-NEXT: retq +entry: + %conv = sext i8 %a to i64 + ret i64 %conv +} + +define i64 @callees16(i16 noundef signext %a) nounwind { +; CHECK-LABEL: callees16: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: # kill: def $edi killed $edi def $rdi +; CHECK-NEXT: movswq %di, %rax +; CHECK-NEXT: retq +entry: + %conv = sext i16 %a to i64 + ret i64 %conv +} + diff --git a/llvm/test/CodeGen/X86/cmp-bool.ll b/llvm/test/CodeGen/X86/cmp-bool.ll --- a/llvm/test/CodeGen/X86/cmp-bool.ll +++ b/llvm/test/CodeGen/X86/cmp-bool.ll @@ -4,7 +4,7 @@ define void @bool_eq(i1 zeroext %a, i1 zeroext %b, void ()* nocapture %c) nounwind { ; CHECK-LABEL: bool_eq: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: xorl %esi, %edi +; CHECK-NEXT: cmpb %sil, %dil ; CHECK-NEXT: je .LBB0_2 ; CHECK-NEXT: # %bb.1: # %if.end ; CHECK-NEXT: retq diff --git a/llvm/test/CodeGen/X86/cmp.ll b/llvm/test/CodeGen/X86/cmp.ll --- a/llvm/test/CodeGen/X86/cmp.ll +++ b/llvm/test/CodeGen/X86/cmp.ll @@ -727,7 +727,8 @@ define i32 @pr42189(i16 signext %c) { ; CHECK-LABEL: pr42189: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: cmpl $32767, %edi # encoding: [0x81,0xff,0xff,0x7f,0x00,0x00] +; CHECK-NEXT: movzwl %di, %eax # encoding: [0x0f,0xb7,0xc7] +; CHECK-NEXT: cmpl $32767, %eax # encoding: [0x3d,0xff,0x7f,0x00,0x00] ; CHECK-NEXT: # imm = 0x7FFF ; CHECK-NEXT: jne .LBB45_2 # encoding: [0x75,A] ; CHECK-NEXT: # fixup A - offset: 1, value: .LBB45_2-1, kind: FK_PCRel_1 diff --git a/llvm/test/CodeGen/X86/commute-two-addr.ll b/llvm/test/CodeGen/X86/commute-two-addr.ll --- a/llvm/test/CodeGen/X86/commute-two-addr.ll +++ b/llvm/test/CodeGen/X86/commute-two-addr.ll @@ -40,6 +40,8 @@ ; DARWIN-LABEL: t3: ; DARWIN: shlq $32, %rcx ; DARWIN-NEXT: orq %rcx, %rax +; DARWIN-NEXT: movzbl %sil, %ecx +; DARWIN-NEXT: movzbl %r8b, %esi ; DARWIN-NEXT: shll $8 ; DARWIN-NOT: leaq %tmp21 = zext i32 %lb to i64 diff --git a/llvm/test/CodeGen/X86/critical-edge-split-2.ll b/llvm/test/CodeGen/X86/critical-edge-split-2.ll --- a/llvm/test/CodeGen/X86/critical-edge-split-2.ll +++ b/llvm/test/CodeGen/X86/critical-edge-split-2.ll @@ -12,7 +12,7 @@ ; CHECK-LABEL: test1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: movw $1, %ax -; CHECK-NEXT: testl %edi, %edi +; CHECK-NEXT: testb %dil, %dil ; CHECK-NEXT: jne .LBB0_2 ; CHECK-NEXT: # %bb.1: # %cond.false.i ; CHECK-NEXT: movl $g_2+4, %eax diff --git a/llvm/test/CodeGen/X86/dagcombine-shifts.ll b/llvm/test/CodeGen/X86/dagcombine-shifts.ll --- a/llvm/test/CodeGen/X86/dagcombine-shifts.ll +++ b/llvm/test/CodeGen/X86/dagcombine-shifts.ll @@ -14,7 +14,7 @@ ; CHECK-LABEL: fun1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: movl %edi, %eax -; CHECK-NEXT: andl $-16, %eax +; CHECK-NEXT: andl $240, %eax ; CHECK-NEXT: # kill: def $ax killed $ax killed $eax ; CHECK-NEXT: retq entry: @@ -28,7 +28,7 @@ ; CHECK-LABEL: fun2: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: movl %edi, %eax -; CHECK-NEXT: andl $-16, %eax +; CHECK-NEXT: andl $240, %eax ; CHECK-NEXT: retq entry: %shr = lshr i8 %v, 4 @@ -41,7 +41,7 @@ ; CHECK-LABEL: fun3: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: movl %edi, %eax -; CHECK-NEXT: andl $-16, %eax +; CHECK-NEXT: andl $65520, %eax # imm = 0xFFF0 ; CHECK-NEXT: retq entry: %shr = lshr i16 %v, 4 @@ -54,7 +54,7 @@ ; CHECK-LABEL: fun4: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: movl %edi, %eax -; CHECK-NEXT: andl $-16, %eax +; CHECK-NEXT: andl $240, %eax ; CHECK-NEXT: retq entry: %shr = lshr i8 %v, 4 @@ -67,7 +67,7 @@ ; CHECK-LABEL: fun5: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: movl %edi, %eax -; CHECK-NEXT: andl $-16, %eax +; CHECK-NEXT: andl $65520, %eax # imm = 0xFFF0 ; CHECK-NEXT: retq entry: %shr = lshr i16 %v, 4 @@ -157,11 +157,11 @@ define i64 @fun11(i16 zeroext %v) { ; CHECK-LABEL: fun11: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: # kill: def $edi killed $edi def $rdi -; CHECK-NEXT: shrl $4, %edi -; CHECK-NEXT: movq %rdi, %rax +; CHECK-NEXT: movzwl %di, %ecx +; CHECK-NEXT: shrl $4, %ecx +; CHECK-NEXT: movq %rcx, %rax ; CHECK-NEXT: shlq $4, %rax -; CHECK-NEXT: addq %rdi, %rax +; CHECK-NEXT: addq %rcx, %rax ; CHECK-NEXT: retq entry: %shr = lshr i16 %v, 4 diff --git a/llvm/test/CodeGen/X86/div-rem-pair-recomposition-signed.ll b/llvm/test/CodeGen/X86/div-rem-pair-recomposition-signed.ll --- a/llvm/test/CodeGen/X86/div-rem-pair-recomposition-signed.ll +++ b/llvm/test/CodeGen/X86/div-rem-pair-recomposition-signed.ll @@ -993,7 +993,7 @@ ; X64-NEXT: cltd ; X64-NEXT: idivl %esi ; X64-NEXT: movl %eax, (%r9) -; X64-NEXT: testl %ecx, %ecx +; X64-NEXT: testb %cl, %cl ; X64-NEXT: je .LBB11_2 ; X64-NEXT: # %bb.1: # %do_srem ; X64-NEXT: movl %eax, %ecx diff --git a/llvm/test/CodeGen/X86/div-rem-pair-recomposition-unsigned.ll b/llvm/test/CodeGen/X86/div-rem-pair-recomposition-unsigned.ll --- a/llvm/test/CodeGen/X86/div-rem-pair-recomposition-unsigned.ll +++ b/llvm/test/CodeGen/X86/div-rem-pair-recomposition-unsigned.ll @@ -993,7 +993,7 @@ ; X64-NEXT: xorl %edx, %edx ; X64-NEXT: divl %esi ; X64-NEXT: movl %eax, (%r9) -; X64-NEXT: testl %ecx, %ecx +; X64-NEXT: testb %cl, %cl ; X64-NEXT: je .LBB11_2 ; X64-NEXT: # %bb.1: # %do_urem ; X64-NEXT: movl %eax, %ecx diff --git a/llvm/test/CodeGen/X86/divide-by-constant.ll b/llvm/test/CodeGen/X86/divide-by-constant.ll --- a/llvm/test/CodeGen/X86/divide-by-constant.ll +++ b/llvm/test/CodeGen/X86/divide-by-constant.ll @@ -14,7 +14,8 @@ ; ; X64-LABEL: test1: ; X64: # %bb.0: # %entry -; X64-NEXT: imull $63551, %edi, %eax # imm = 0xF83F +; X64-NEXT: movzwl %di, %eax +; X64-NEXT: imull $63551, %eax, %eax # imm = 0xF83F ; X64-NEXT: shrl $21, %eax ; X64-NEXT: # kill: def $ax killed $ax killed $eax ; X64-NEXT: retq @@ -34,7 +35,8 @@ ; ; X64-LABEL: test2: ; X64: # %bb.0: # %entry -; X64-NEXT: imull $43691, %esi, %eax # imm = 0xAAAB +; X64-NEXT: movzwl %si, %eax +; X64-NEXT: imull $43691, %eax, %eax # imm = 0xAAAB ; X64-NEXT: shrl $17, %eax ; X64-NEXT: # kill: def $ax killed $ax killed $eax ; X64-NEXT: retq @@ -55,7 +57,8 @@ ; ; X64-LABEL: test3: ; X64: # %bb.0: # %entry -; X64-NEXT: imull $171, %esi, %eax +; X64-NEXT: movzbl %sil, %eax +; X64-NEXT: imull $171, %eax, %eax ; X64-NEXT: shrl $9, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq @@ -78,7 +81,8 @@ ; ; X64-LABEL: test4: ; X64: # %bb.0: # %entry -; X64-NEXT: imull $1986, %edi, %eax # imm = 0x7C2 +; X64-NEXT: movswl %di, %eax +; X64-NEXT: imull $1986, %eax, %eax # imm = 0x7C2 ; X64-NEXT: movl %eax, %ecx ; X64-NEXT: shrl $31, %ecx ; X64-NEXT: shrl $16, %eax @@ -124,7 +128,8 @@ ; ; X64-LABEL: test6: ; X64: # %bb.0: # %entry -; X64-NEXT: imull $26215, %edi, %eax # imm = 0x6667 +; X64-NEXT: movswl %di, %eax +; X64-NEXT: imull $26215, %eax, %eax # imm = 0x6667 ; X64-NEXT: movl %eax, %ecx ; X64-NEXT: shrl $31, %ecx ; X64-NEXT: sarl $18, %eax diff --git a/llvm/test/CodeGen/X86/fdiv-combine.ll b/llvm/test/CodeGen/X86/fdiv-combine.ll --- a/llvm/test/CodeGen/X86/fdiv-combine.ll +++ b/llvm/test/CodeGen/X86/fdiv-combine.ll @@ -99,7 +99,7 @@ define float @div_select_constant_fold(i1 zeroext %arg) { ; CHECK-LABEL: div_select_constant_fold: ; CHECK: # %bb.0: -; CHECK-NEXT: testl %edi, %edi +; CHECK-NEXT: testb %dil, %dil ; CHECK-NEXT: jne .LBB6_1 ; CHECK-NEXT: # %bb.2: ; CHECK-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero diff --git a/llvm/test/CodeGen/X86/fp128-select.ll b/llvm/test/CodeGen/X86/fp128-select.ll --- a/llvm/test/CodeGen/X86/fp128-select.ll +++ b/llvm/test/CodeGen/X86/fp128-select.ll @@ -11,7 +11,7 @@ define void @test_select(fp128* %p, fp128* %q, i1 zeroext %c) { ; SSE-LABEL: test_select: ; SSE: # %bb.0: -; SSE-NEXT: testl %edx, %edx +; SSE-NEXT: testb %dl, %dl ; SSE-NEXT: jne .LBB0_1 ; SSE-NEXT: # %bb.2: ; SSE-NEXT: movaps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 @@ -25,7 +25,7 @@ ; NOSSE-LABEL: test_select: ; NOSSE: # %bb.0: ; NOSSE-NEXT: xorl %eax, %eax -; NOSSE-NEXT: testl %edx, %edx +; NOSSE-NEXT: testb %dl, %dl ; NOSSE-NEXT: cmovneq (%rdi), %rax ; NOSSE-NEXT: movabsq $9223231299366420480, %rcx # imm = 0x7FFF800000000000 ; NOSSE-NEXT: cmovneq 8(%rdi), %rcx diff --git a/llvm/test/CodeGen/X86/illegal-bitfield-loadstore.ll b/llvm/test/CodeGen/X86/illegal-bitfield-loadstore.ll --- a/llvm/test/CodeGen/X86/illegal-bitfield-loadstore.ll +++ b/llvm/test/CodeGen/X86/illegal-bitfield-loadstore.ll @@ -86,15 +86,16 @@ ; ; X64-LABEL: i24_insert_bit: ; X64: # %bb.0: -; X64-NEXT: movzwl (%rdi), %eax -; X64-NEXT: movzbl 2(%rdi), %ecx -; X64-NEXT: movb %cl, 2(%rdi) -; X64-NEXT: shll $16, %ecx -; X64-NEXT: orl %eax, %ecx -; X64-NEXT: shll $13, %esi -; X64-NEXT: andl $16769023, %ecx # imm = 0xFFDFFF -; X64-NEXT: orl %esi, %ecx -; X64-NEXT: movw %cx, (%rdi) +; X64-NEXT: movzbl %sil, %eax +; X64-NEXT: movzwl (%rdi), %ecx +; X64-NEXT: movzbl 2(%rdi), %edx +; X64-NEXT: movb %dl, 2(%rdi) +; X64-NEXT: shll $16, %edx +; X64-NEXT: orl %ecx, %edx +; X64-NEXT: shll $13, %eax +; X64-NEXT: andl $16769023, %edx # imm = 0xFFDFFF +; X64-NEXT: orl %eax, %edx +; X64-NEXT: movw %dx, (%rdi) ; X64-NEXT: retq %extbit = zext i1 %bit to i24 %b = load i24, i24* %a, align 1 @@ -183,7 +184,7 @@ ; ; X64-LABEL: i56_insert_bit: ; X64: # %bb.0: -; X64-NEXT: movl %esi, %eax +; X64-NEXT: movzbl %sil, %eax ; X64-NEXT: movzwl 4(%rdi), %ecx ; X64-NEXT: movzbl 6(%rdi), %edx ; X64-NEXT: movb %dl, 6(%rdi) diff --git a/llvm/test/CodeGen/X86/known-signbits-vector.ll b/llvm/test/CodeGen/X86/known-signbits-vector.ll --- a/llvm/test/CodeGen/X86/known-signbits-vector.ll +++ b/llvm/test/CodeGen/X86/known-signbits-vector.ll @@ -37,8 +37,10 @@ ; ; X64-LABEL: signbits_sext_v4i64_sitofp_v4f32: ; X64: # %bb.0: -; X64-NEXT: vmovd %edi, %xmm0 -; X64-NEXT: vpinsrd $1, %esi, %xmm0, %xmm0 +; X64-NEXT: movswl %si, %eax +; X64-NEXT: movsbl %dil, %esi +; X64-NEXT: vmovd %esi, %xmm0 +; X64-NEXT: vpinsrd $1, %eax, %xmm0, %xmm0 ; X64-NEXT: vpinsrd $2, %edx, %xmm0, %xmm0 ; X64-NEXT: vpinsrd $3, %ecx, %xmm0, %xmm0 ; X64-NEXT: vcvtdq2ps %xmm0, %xmm0 diff --git a/llvm/test/CodeGen/X86/mask-negated-bool.ll b/llvm/test/CodeGen/X86/mask-negated-bool.ll --- a/llvm/test/CodeGen/X86/mask-negated-bool.ll +++ b/llvm/test/CodeGen/X86/mask-negated-bool.ll @@ -16,7 +16,7 @@ define i32 @mask_negated_zext_bool2(i1 zeroext %x) { ; CHECK-LABEL: mask_negated_zext_bool2: ; CHECK: # %bb.0: -; CHECK-NEXT: movl %edi, %eax +; CHECK-NEXT: movzbl %dil, %eax ; CHECK-NEXT: retq %ext = zext i1 %x to i32 %neg = sub i32 0, %ext @@ -50,7 +50,7 @@ define i32 @mask_negated_sext_bool2(i1 zeroext %x) { ; CHECK-LABEL: mask_negated_sext_bool2: ; CHECK: # %bb.0: -; CHECK-NEXT: movl %edi, %eax +; CHECK-NEXT: movzbl %dil, %eax ; CHECK-NEXT: retq %ext = sext i1 %x to i32 %neg = sub i32 0, %ext diff --git a/llvm/test/CodeGen/X86/musttail-varargs.ll b/llvm/test/CodeGen/X86/musttail-varargs.ll --- a/llvm/test/CodeGen/X86/musttail-varargs.ll +++ b/llvm/test/CodeGen/X86/musttail-varargs.ll @@ -144,7 +144,6 @@ ; LINUX-X32-NEXT: movq %rcx, %r13 ; LINUX-X32-NEXT: movq %rdx, %rbp ; LINUX-X32-NEXT: movq %rsi, %rbx -; LINUX-X32-NEXT: movq %rdi, %r14 ; LINUX-X32-NEXT: movq %rsi, {{[0-9]+}}(%esp) ; LINUX-X32-NEXT: movq %rdx, {{[0-9]+}}(%esp) ; LINUX-X32-NEXT: movq %rcx, {{[0-9]+}}(%esp) @@ -168,6 +167,8 @@ ; LINUX-X32-NEXT: movl %eax, {{[0-9]+}}(%esp) ; LINUX-X32-NEXT: movabsq $206158430216, %rax # imm = 0x3000000008 ; LINUX-X32-NEXT: movq %rax, {{[0-9]+}}(%esp) +; LINUX-X32-NEXT: movl %edi, %r14d +; LINUX-X32-NEXT: movq %r14, %rdi ; LINUX-X32-NEXT: callq get_f@PLT ; LINUX-X32-NEXT: movl %eax, %r11d ; LINUX-X32-NEXT: movq %r14, %rdi @@ -302,6 +303,7 @@ ; ; LINUX-X32-LABEL: g_thunk: ; LINUX-X32: # %bb.0: +; LINUX-X32-NEXT: movl %edi, %edi ; LINUX-X32-NEXT: jmpq *%rdi # TAILCALL ; ; WINDOWS-LABEL: g_thunk: diff --git a/llvm/test/CodeGen/X86/negate-i1.ll b/llvm/test/CodeGen/X86/negate-i1.ll --- a/llvm/test/CodeGen/X86/negate-i1.ll +++ b/llvm/test/CodeGen/X86/negate-i1.ll @@ -61,7 +61,7 @@ define i16 @select_i16_neg1_or_0_zeroext(i1 zeroext %a) { ; X64-LABEL: select_i16_neg1_or_0_zeroext: ; X64: # %bb.0: -; X64-NEXT: movl %edi, %eax +; X64-NEXT: movzbl %dil, %eax ; X64-NEXT: negl %eax ; X64-NEXT: # kill: def $ax killed $ax killed $eax ; X64-NEXT: retq @@ -97,7 +97,7 @@ define i32 @select_i32_neg1_or_0_zeroext(i1 zeroext %a) { ; X64-LABEL: select_i32_neg1_or_0_zeroext: ; X64: # %bb.0: -; X64-NEXT: movl %edi, %eax +; X64-NEXT: movzbl %dil, %eax ; X64-NEXT: negl %eax ; X64-NEXT: retq ; @@ -132,7 +132,7 @@ define i64 @select_i64_neg1_or_0_zeroext(i1 zeroext %a) { ; X64-LABEL: select_i64_neg1_or_0_zeroext: ; X64: # %bb.0: -; X64-NEXT: movl %edi, %eax +; X64-NEXT: movzbl %dil, %eax ; X64-NEXT: negq %rax ; X64-NEXT: retq ; diff --git a/llvm/test/CodeGen/X86/or-with-overflow.ll b/llvm/test/CodeGen/X86/or-with-overflow.ll --- a/llvm/test/CodeGen/X86/or-with-overflow.ll +++ b/llvm/test/CodeGen/X86/or-with-overflow.ll @@ -48,6 +48,7 @@ ; X64: # %bb.0: ; X64-NEXT: movl %esi, %eax ; X64-NEXT: orl %edi, %eax +; X64-NEXT: testb %al, %al ; X64-NEXT: cmovel %edi, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq @@ -102,6 +103,7 @@ ; X64: # %bb.0: ; X64-NEXT: movl %esi, %eax ; X64-NEXT: orl %edi, %eax +; X64-NEXT: testw %ax, %ax ; X64-NEXT: cmovel %edi, %eax ; X64-NEXT: # kill: def $ax killed $ax killed $eax ; X64-NEXT: retq diff --git a/llvm/test/CodeGen/X86/popcnt.ll b/llvm/test/CodeGen/X86/popcnt.ll --- a/llvm/test/CodeGen/X86/popcnt.ll +++ b/llvm/test/CodeGen/X86/popcnt.ll @@ -1490,20 +1490,21 @@ ; ; X64-LABEL: popcount_zext_i32: ; X64: # %bb.0: -; X64-NEXT: movl %edi, %eax -; X64-NEXT: shrl %eax -; X64-NEXT: andl $21845, %eax # imm = 0x5555 -; X64-NEXT: subl %eax, %edi -; X64-NEXT: movl %edi, %eax +; X64-NEXT: movzwl %di, %eax +; X64-NEXT: movl %eax, %ecx +; X64-NEXT: shrl %ecx +; X64-NEXT: andl $21845, %ecx # imm = 0x5555 +; X64-NEXT: subl %ecx, %eax +; X64-NEXT: movl %eax, %ecx +; X64-NEXT: andl $858993459, %ecx # imm = 0x33333333 +; X64-NEXT: shrl $2, %eax ; X64-NEXT: andl $858993459, %eax # imm = 0x33333333 -; X64-NEXT: shrl $2, %edi -; X64-NEXT: andl $858993459, %edi # imm = 0x33333333 -; X64-NEXT: addl %eax, %edi -; X64-NEXT: movl %edi, %eax -; X64-NEXT: shrl $4, %eax -; X64-NEXT: addl %edi, %eax -; X64-NEXT: andl $252645135, %eax # imm = 0xF0F0F0F -; X64-NEXT: imull $16843009, %eax, %eax # imm = 0x1010101 +; X64-NEXT: addl %ecx, %eax +; X64-NEXT: movl %eax, %ecx +; X64-NEXT: shrl $4, %ecx +; X64-NEXT: addl %eax, %ecx +; X64-NEXT: andl $252645135, %ecx # imm = 0xF0F0F0F +; X64-NEXT: imull $16843009, %ecx, %eax # imm = 0x1010101 ; X64-NEXT: shrl $24, %eax ; X64-NEXT: retq ; @@ -1515,7 +1516,8 @@ ; ; X64-POPCNT-LABEL: popcount_zext_i32: ; X64-POPCNT: # %bb.0: -; X64-POPCNT-NEXT: popcntl %edi, %eax +; X64-POPCNT-NEXT: movzwl %di, %eax +; X64-POPCNT-NEXT: popcntl %eax, %eax ; X64-POPCNT-NEXT: retq %z = zext i16 %x to i32 %cnt = tail call i32 @llvm.ctpop.i32(i32 %z) @@ -1574,7 +1576,8 @@ ; ; X64-POPCNT-LABEL: popcount_i16_zext: ; X64-POPCNT: # %bb.0: -; X64-POPCNT-NEXT: popcntl %edi, %eax +; X64-POPCNT-NEXT: movzwl %di, %eax +; X64-POPCNT-NEXT: popcntl %eax, %eax ; X64-POPCNT-NEXT: retq %cnt = tail call i16 @llvm.ctpop.i16(i16 %x) %z = zext i16 %cnt to i32 diff --git a/llvm/test/CodeGen/X86/pr49028.ll b/llvm/test/CodeGen/X86/pr49028.ll --- a/llvm/test/CodeGen/X86/pr49028.ll +++ b/llvm/test/CodeGen/X86/pr49028.ll @@ -16,6 +16,7 @@ ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax ; X64-NEXT: shrl %eax +; X64-NEXT: andl $32767, %eax # imm = 0x7FFF ; X64-NEXT: sete (%rsi) ; X64-NEXT: # kill: def $ax killed $ax killed $eax ; X64-NEXT: retq diff --git a/llvm/test/CodeGen/X86/select-ext.ll b/llvm/test/CodeGen/X86/select-ext.ll --- a/llvm/test/CodeGen/X86/select-ext.ll +++ b/llvm/test/CodeGen/X86/select-ext.ll @@ -7,7 +7,7 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: movzbl (%rdi), %ecx ; CHECK-NEXT: movzbl 1(%rdi), %eax -; CHECK-NEXT: testl %esi, %esi +; CHECK-NEXT: testb %sil, %sil ; CHECK-NEXT: cmoveq %rcx, %rax ; CHECK-NEXT: retq %ld1 = load volatile i8, i8* %p @@ -23,7 +23,7 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: movzbl (%rdi), %ecx ; CHECK-NEXT: movzwl (%rsi), %eax -; CHECK-NEXT: testl %edx, %edx +; CHECK-NEXT: testb %dl, %dl ; CHECK-NEXT: cmoveq %rcx, %rax ; CHECK-NEXT: retq %ld1 = load volatile i8, i8* %p @@ -39,7 +39,7 @@ ; CHECK-LABEL: zext_scalar_neg: ; CHECK: # %bb.0: ; CHECK-NEXT: movsbl (%rdi), %eax -; CHECK-NEXT: testl %edx, %edx +; CHECK-NEXT: testb %dl, %dl ; CHECK-NEXT: je .LBB2_2 ; CHECK-NEXT: # %bb.1: ; CHECK-NEXT: movzwl (%rsi), %eax @@ -60,7 +60,7 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: movsbq (%rdi), %rcx ; CHECK-NEXT: movsbq 1(%rdi), %rax -; CHECK-NEXT: testl %esi, %esi +; CHECK-NEXT: testb %sil, %sil ; CHECK-NEXT: cmoveq %rcx, %rax ; CHECK-NEXT: retq %ld1 = load volatile i8, i8* %p @@ -77,7 +77,7 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: pmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero ; CHECK-NEXT: pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero -; CHECK-NEXT: testl %esi, %esi +; CHECK-NEXT: testb %sil, %sil ; CHECK-NEXT: jne .LBB4_2 ; CHECK-NEXT: # %bb.1: ; CHECK-NEXT: movdqa %xmm1, %xmm0 @@ -114,7 +114,7 @@ ; CHECK: # %bb.0: ; CHECK-NEXT: pmovsxdq (%rdi), %xmm1 ; CHECK-NEXT: pmovsxdq 8(%rdi), %xmm0 -; CHECK-NEXT: testl %esi, %esi +; CHECK-NEXT: testb %sil, %sil ; CHECK-NEXT: jne .LBB6_2 ; CHECK-NEXT: # %bb.1: ; CHECK-NEXT: movdqa %xmm1, %xmm0 diff --git a/llvm/test/CodeGen/X86/select_const.ll b/llvm/test/CodeGen/X86/select_const.ll --- a/llvm/test/CodeGen/X86/select_const.ll +++ b/llvm/test/CodeGen/X86/select_const.ll @@ -53,7 +53,7 @@ define i32 @select_1_or_0_zeroext(i1 zeroext %cond) { ; CHECK-LABEL: select_1_or_0_zeroext: ; CHECK: # %bb.0: -; CHECK-NEXT: movl %edi, %eax +; CHECK-NEXT: movzbl %dil, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 1, i32 0 ret i32 %sel @@ -62,7 +62,7 @@ define i32 @select_1_or_0_signext(i1 signext %cond) { ; CHECK-LABEL: select_1_or_0_signext: ; CHECK: # %bb.0: -; CHECK-NEXT: movl %edi, %eax +; CHECK-NEXT: movzbl %dil, %eax ; CHECK-NEXT: andl $1, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 1, i32 0 @@ -85,8 +85,8 @@ define i32 @select_0_or_neg1_zeroext(i1 zeroext %cond) { ; CHECK-LABEL: select_0_or_neg1_zeroext: ; CHECK: # %bb.0: -; CHECK-NEXT: # kill: def $edi killed $edi def $rdi -; CHECK-NEXT: leal -1(%rdi), %eax +; CHECK-NEXT: movzbl %dil, %eax +; CHECK-NEXT: decl %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 0, i32 -1 ret i32 %sel @@ -95,8 +95,9 @@ define i32 @select_0_or_neg1_signext(i1 signext %cond) { ; CHECK-LABEL: select_0_or_neg1_signext: ; CHECK: # %bb.0: -; CHECK-NEXT: movl %edi, %eax -; CHECK-NEXT: notl %eax +; CHECK-NEXT: movzbl %dil, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: decl %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 0, i32 -1 ret i32 %sel @@ -118,7 +119,7 @@ define i32 @select_neg1_or_0_zeroext(i1 zeroext %cond) { ; CHECK-LABEL: select_neg1_or_0_zeroext: ; CHECK: # %bb.0: -; CHECK-NEXT: movl %edi, %eax +; CHECK-NEXT: movzbl %dil, %eax ; CHECK-NEXT: negl %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 -1, i32 0 @@ -128,7 +129,7 @@ define i32 @select_neg1_or_0_signext(i1 signext %cond) { ; CHECK-LABEL: select_neg1_or_0_signext: ; CHECK: # %bb.0: -; CHECK-NEXT: movl %edi, %eax +; CHECK-NEXT: movsbl %dil, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 -1, i32 0 ret i32 %sel @@ -150,8 +151,8 @@ define i32 @select_Cplus1_C_zeroext(i1 zeroext %cond) { ; CHECK-LABEL: select_Cplus1_C_zeroext: ; CHECK: # %bb.0: -; CHECK-NEXT: # kill: def $edi killed $edi def $rdi -; CHECK-NEXT: leal 41(%rdi), %eax +; CHECK-NEXT: movzbl %dil, %eax +; CHECK-NEXT: addl $41, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 42, i32 41 ret i32 %sel @@ -160,8 +161,9 @@ define i32 @select_Cplus1_C_signext(i1 signext %cond) { ; CHECK-LABEL: select_Cplus1_C_signext: ; CHECK: # %bb.0: -; CHECK-NEXT: movl $41, %eax -; CHECK-NEXT: subl %edi, %eax +; CHECK-NEXT: movzbl %dil, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: addl $41, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 42, i32 41 ret i32 %sel @@ -183,8 +185,9 @@ define i32 @select_C_Cplus1_zeroext(i1 zeroext %cond) { ; CHECK-LABEL: select_C_Cplus1_zeroext: ; CHECK: # %bb.0: +; CHECK-NEXT: movzbl %dil, %ecx ; CHECK-NEXT: movl $42, %eax -; CHECK-NEXT: subl %edi, %eax +; CHECK-NEXT: subl %ecx, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 41, i32 42 ret i32 %sel @@ -193,8 +196,10 @@ define i32 @select_C_Cplus1_signext(i1 signext %cond) { ; CHECK-LABEL: select_C_Cplus1_signext: ; CHECK: # %bb.0: -; CHECK-NEXT: # kill: def $edi killed $edi def $rdi -; CHECK-NEXT: leal 42(%rdi), %eax +; CHECK-NEXT: movzbl %dil, %ecx +; CHECK-NEXT: andl $1, %ecx +; CHECK-NEXT: movl $42, %eax +; CHECK-NEXT: subl %ecx, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 41, i32 42 ret i32 %sel @@ -353,9 +358,9 @@ define i32 @select_pow2_diff_neg(i1 zeroext %cond) { ; CHECK-LABEL: select_pow2_diff_neg: ; CHECK: # %bb.0: -; CHECK-NEXT: # kill: def $edi killed $edi def $rdi -; CHECK-NEXT: shll $4, %edi -; CHECK-NEXT: leal -25(%rdi), %eax +; CHECK-NEXT: movzbl %dil, %eax +; CHECK-NEXT: shll $4, %eax +; CHECK-NEXT: orl $-25, %eax ; CHECK-NEXT: retq %sel = select i1 %cond, i32 -9, i32 -25 ret i32 %sel @@ -408,7 +413,7 @@ define i32 @select_C1_C2_zeroext(i1 zeroext %cond) { ; CHECK-LABEL: select_C1_C2_zeroext: ; CHECK: # %bb.0: -; CHECK-NEXT: testl %edi, %edi +; CHECK-NEXT: testb %dil, %dil ; CHECK-NEXT: movl $421, %ecx # imm = 0x1A5 ; CHECK-NEXT: movl $42, %eax ; CHECK-NEXT: cmovnel %ecx, %eax diff --git a/llvm/test/CodeGen/X86/setcc-logic.ll b/llvm/test/CodeGen/X86/setcc-logic.ll --- a/llvm/test/CodeGen/X86/setcc-logic.ll +++ b/llvm/test/CodeGen/X86/setcc-logic.ll @@ -646,18 +646,12 @@ } define i1 @or_cmp_eq_i16(i16 zeroext %x, i16 zeroext %y) { -; NOBMI-LABEL: or_cmp_eq_i16: -; NOBMI: # %bb.0: -; NOBMI-NEXT: notl %edi -; NOBMI-NEXT: testl %esi, %edi -; NOBMI-NEXT: sete %al -; NOBMI-NEXT: retq -; -; BMI-LABEL: or_cmp_eq_i16: -; BMI: # %bb.0: -; BMI-NEXT: andnl %esi, %edi, %eax -; BMI-NEXT: sete %al -; BMI-NEXT: retq +; CHECK-LABEL: or_cmp_eq_i16: +; CHECK: # %bb.0: +; CHECK-NEXT: notl %edi +; CHECK-NEXT: testw %si, %di +; CHECK-NEXT: sete %al +; CHECK-NEXT: retq %o = or i16 %x, %y %c = icmp eq i16 %x, %o ret i1 %c diff --git a/llvm/test/CodeGen/X86/sext-i1.ll b/llvm/test/CodeGen/X86/sext-i1.ll --- a/llvm/test/CodeGen/X86/sext-i1.ll +++ b/llvm/test/CodeGen/X86/sext-i1.ll @@ -153,8 +153,8 @@ ; ; X64-LABEL: select_0_or_1s_zeroext: ; X64: # %bb.0: -; X64-NEXT: # kill: def $edi killed $edi def $rdi -; X64-NEXT: leal -1(%rdi), %eax +; X64-NEXT: movzbl %dil, %eax +; X64-NEXT: decl %eax ; X64-NEXT: retq %not = xor i1 %cond, 1 %sext = sext i1 %not to i32 @@ -173,8 +173,9 @@ ; ; X64-LABEL: select_0_or_1s_signext: ; X64: # %bb.0: -; X64-NEXT: movl %edi, %eax -; X64-NEXT: notl %eax +; X64-NEXT: movzbl %dil, %eax +; X64-NEXT: andl $1, %eax +; X64-NEXT: decl %eax ; X64-NEXT: retq %not = xor i1 %cond, 1 %sext = sext i1 %not to i32 diff --git a/llvm/test/CodeGen/X86/sibcall.ll b/llvm/test/CodeGen/X86/sibcall.ll --- a/llvm/test/CodeGen/X86/sibcall.ll +++ b/llvm/test/CodeGen/X86/sibcall.ll @@ -74,7 +74,7 @@ ; ; X32-LABEL: t4: ; X32: # %bb.0: -; X32-NEXT: movq %rdi, %rax +; X32-NEXT: movl %edi, %eax ; X32-NEXT: xorl %edi, %edi ; X32-NEXT: jmpq *%rax # TAILCALL tail call void %x(i32 0) nounwind @@ -92,7 +92,8 @@ ; ; X32-LABEL: t5: ; X32: # %bb.0: -; X32-NEXT: jmpq *%rdi # TAILCALL +; X32-NEXT: movl %edi, %eax +; X32-NEXT: jmpq *%rax # TAILCALL tail call void %x() nounwind ret void } @@ -223,7 +224,7 @@ ; ; X32-LABEL: t9: ; X32: # %bb.0: # %entry -; X32-NEXT: movq %rdi, %rax +; X32-NEXT: movl %edi, %eax ; X32-NEXT: xorl %edi, %edi ; X32-NEXT: jmpq *%rax # TAILCALL entry: @@ -475,6 +476,7 @@ ; X32: # %bb.0: ; X32-NEXT: pushq %rbx ; X32-NEXT: movq %rdi, %rbx +; X32-NEXT: movl %ebx, %edi ; X32-NEXT: callq f ; X32-NEXT: movl %ebx, %eax ; X32-NEXT: popq %rbx @@ -649,6 +651,7 @@ ; X32: # %bb.0: ; X32-NEXT: pushq %rbx ; X32-NEXT: movq %rdi, %rbx +; X32-NEXT: movl %ebx, %edi ; X32-NEXT: callq t21_f_sret ; X32-NEXT: movl %ebx, %eax ; X32-NEXT: popq %rbx @@ -684,6 +687,7 @@ ; X32: # %bb.0: ; X32-NEXT: pushq %rbx ; X32-NEXT: movq %rdi, %rbx +; X32-NEXT: movl %ebx, %edi ; X32-NEXT: callq f_sret@PLT ; X32-NEXT: movl %ebx, %eax ; X32-NEXT: popq %rbx @@ -719,7 +723,7 @@ ; X32: # %bb.0: ; X32-NEXT: pushq %rbx ; X32-NEXT: movq %rsi, %rbx -; X32-NEXT: movq %rsi, %rdi +; X32-NEXT: movl %ebx, %edi ; X32-NEXT: callq t21_f_sret ; X32-NEXT: movl %ebx, %eax ; X32-NEXT: popq %rbx @@ -760,6 +764,7 @@ ; X32-NEXT: pushq %rbx ; X32-NEXT: movl %esi, %eax ; X32-NEXT: movq %rdi, %rbx +; X32-NEXT: movl %ebx, %edi ; X32-NEXT: movl %edx, %esi ; X32-NEXT: movl %eax, %edx ; X32-NEXT: callq f_sret@PLT @@ -798,7 +803,7 @@ ; X32: # %bb.0: ; X32-NEXT: pushq %rbx ; X32-NEXT: movq %rdi, %rbx -; X32-NEXT: movq %rsi, %rdi +; X32-NEXT: movl %esi, %edi ; X32-NEXT: callq t21_f_sret ; X32-NEXT: movl %ebx, %eax ; X32-NEXT: popq %rbx @@ -834,7 +839,7 @@ ; X32: # %bb.0: ; X32-NEXT: pushq %rbx ; X32-NEXT: movq %rdi, %rbx -; X32-NEXT: movq %rsi, %rdi +; X32-NEXT: movl %esi, %edi ; X32-NEXT: callq t21_f_sret ; X32-NEXT: movl %ebx, %eax ; X32-NEXT: popq %rbx @@ -926,8 +931,8 @@ ; X32-NEXT: movq %rsi, %rbx ; X32-NEXT: movq %rdi, %r14 ; X32-NEXT: callq ret_struct@PLT +; X32-NEXT: movl %ebx, %edi ; X32-NEXT: movl %eax, %esi -; X32-NEXT: movq %rbx, %rdi ; X32-NEXT: callq t21_f_sret2 ; X32-NEXT: movl %r14d, %eax ; X32-NEXT: addl $8, %esp @@ -967,6 +972,7 @@ ; X32: # %bb.0: ; X32-NEXT: pushq %rbx ; X32-NEXT: movq %rdi, %rbx +; X32-NEXT: movl %ebx, %edi ; X32-NEXT: callq t21_f_non_sret ; X32-NEXT: movl %ebx, %eax ; X32-NEXT: popq %rbx @@ -988,11 +994,12 @@ ; ; X64-LABEL: t22_non_sret_to_sret: ; X64: # %bb.0: -; X64-NEXT: jmp t22_f_sret@PLT # TAILCALL +; X64-NEXT: jmp t22_f_sret@PLT # TAILCALL ; ; X32-LABEL: t22_non_sret_to_sret: ; X32: # %bb.0: -; X32-NEXT: jmp t22_f_sret@PLT # TAILCALL +; X32-NEXT: movl %edi, %edi +; X32-NEXT: jmp t22_f_sret@PLT # TAILCALL tail call ccc void @t22_f_sret(%struct.foo* noalias sret(%struct.foo) %agg.result) nounwind ret void } diff --git a/llvm/test/CodeGen/X86/split-store.ll b/llvm/test/CodeGen/X86/split-store.ll --- a/llvm/test/CodeGen/X86/split-store.ll +++ b/llvm/test/CodeGen/X86/split-store.ll @@ -197,11 +197,13 @@ define void @int7_int7_pair(i7 signext %tmp1, i7 signext %tmp2, i14* %ref.tmp) { ; CHECK-LABEL: int7_int7_pair: ; CHECK: # %bb.0: -; CHECK-NEXT: shll $7, %esi -; CHECK-NEXT: andl $127, %edi -; CHECK-NEXT: orl %esi, %edi -; CHECK-NEXT: andl $16383, %edi # imm = 0x3FFF -; CHECK-NEXT: movw %di, (%rdx) +; CHECK-NEXT: movzbl %sil, %eax +; CHECK-NEXT: shll $7, %eax +; CHECK-NEXT: movzbl %dil, %ecx +; CHECK-NEXT: andl $127, %ecx +; CHECK-NEXT: orl %eax, %ecx +; CHECK-NEXT: andl $16383, %ecx # imm = 0x3FFF +; CHECK-NEXT: movw %cx, (%rdx) ; CHECK-NEXT: retq %t1 = zext i7 %tmp2 to i14 %t2 = shl nuw i14 %t1, 7 diff --git a/llvm/test/CodeGen/X86/x86-64-arg.ll b/llvm/test/CodeGen/X86/x86-64-arg.ll --- a/llvm/test/CodeGen/X86/x86-64-arg.ll +++ b/llvm/test/CodeGen/X86/x86-64-arg.ll @@ -12,7 +12,7 @@ define i32 @test(i16 signext %X) { ; CHECK-LABEL: test: ; CHECK: ## %bb.0: ## %entry -; CHECK-NEXT: movl %edi, %eax +; CHECK-NEXT: movswl %di, %eax ; CHECK-NEXT: retq entry: %tmp12 = sext i16 %X to i32 ; [#uses=1] diff --git a/llvm/test/CodeGen/X86/xor-icmp.ll b/llvm/test/CodeGen/X86/xor-icmp.ll --- a/llvm/test/CodeGen/X86/xor-icmp.ll +++ b/llvm/test/CodeGen/X86/xor-icmp.ll @@ -102,7 +102,7 @@ ; X64-LABEL: xor_not_bools: ; X64: # %bb.0: ; X64-NEXT: movl %edi, %eax -; X64-NEXT: xorl %esi, %eax +; X64-NEXT: xorb %sil, %al ; X64-NEXT: xorb $1, %al ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq diff --git a/llvm/test/CodeGen/X86/xor-with-overflow.ll b/llvm/test/CodeGen/X86/xor-with-overflow.ll --- a/llvm/test/CodeGen/X86/xor-with-overflow.ll +++ b/llvm/test/CodeGen/X86/xor-with-overflow.ll @@ -48,6 +48,7 @@ ; X64: # %bb.0: ; X64-NEXT: movl %esi, %eax ; X64-NEXT: xorl %edi, %eax +; X64-NEXT: testb %al, %al ; X64-NEXT: cmovel %edi, %eax ; X64-NEXT: # kill: def $al killed $al killed $eax ; X64-NEXT: retq @@ -102,6 +103,7 @@ ; X64: # %bb.0: ; X64-NEXT: movl %esi, %eax ; X64-NEXT: xorl %edi, %eax +; X64-NEXT: testw %ax, %ax ; X64-NEXT: cmovel %edi, %eax ; X64-NEXT: # kill: def $ax killed $ax killed $eax ; X64-NEXT: retq