diff options
author | Craig Topper <craig.topper@intel.com> | 2018-10-01 21:35:26 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2018-10-01 21:35:26 +0000 |
commit | f06a57fc898e02b024b1156ec09a92e3448d4134 (patch) | |
tree | 4cb0add215afea9a053cb0147dfc0c4747946431 /llvm/test/CodeGen | |
parent | 12ae3e678d0f7efecd5eead4b6d5a06b592db3e8 (diff) | |
download | bcm5719-llvm-f06a57fc898e02b024b1156ec09a92e3448d4134.tar.gz bcm5719-llvm-f06a57fc898e02b024b1156ec09a92e3448d4134.zip |
Recommit r343498 "[X86] Improve test instruction shrinking when the sign flag is used and the output of the and is truncated."
This includes a fix to prevent i16 compares with i32/i64 ands from being shrunk if bit 15 of the and is set and the sign bit is used.
Original commit message:
Currently we skip looking through truncates if the sign flag is used. But that's overly restrictive.
It's safe to look through the truncate as long as we ensure one of the 3 things when we shrink. Either the MSB of the mask at the shrunken size isn't set. If the mask bit is set then either the shrunk size needs to be equal to the compare size or the sign
There are still missed opportunities to shrink a load and fold it in here. This will be fixed in a future patch.
llvm-svn: 343539
Diffstat (limited to 'llvm/test/CodeGen')
-rw-r--r-- | llvm/test/CodeGen/X86/2010-08-04-MaskedSignedCompare.ll | 3 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/test-shrink.ll | 53 |
2 files changed, 20 insertions, 36 deletions
diff --git a/llvm/test/CodeGen/X86/2010-08-04-MaskedSignedCompare.ll b/llvm/test/CodeGen/X86/2010-08-04-MaskedSignedCompare.ll index 9bbd86ca646..4f6f0c9201b 100644 --- a/llvm/test/CodeGen/X86/2010-08-04-MaskedSignedCompare.ll +++ b/llvm/test/CodeGen/X86/2010-08-04-MaskedSignedCompare.ll @@ -12,8 +12,7 @@ define i32 @main() nounwind { ; CHECK-NEXT: xorl %eax, %eax ; CHECK-NEXT: cmpq {{.*}}(%rip), %rax ; CHECK-NEXT: sbbl %eax, %eax -; CHECK-NEXT: andl $150, %eax -; CHECK-NEXT: testb %al, %al +; CHECK-NEXT: testb $-106, %al ; CHECK-NEXT: jle .LBB0_1 ; CHECK-NEXT: # %bb.2: # %if.then ; CHECK-NEXT: movl $1, {{.*}}(%rip) diff --git a/llvm/test/CodeGen/X86/test-shrink.ll b/llvm/test/CodeGen/X86/test-shrink.ll index c226a996ca2..ea68d38dcf1 100644 --- a/llvm/test/CodeGen/X86/test-shrink.ll +++ b/llvm/test/CodeGen/X86/test-shrink.ll @@ -578,8 +578,7 @@ no: define void @and16_trunc_8_sign(i16 %x) nounwind { ; CHECK-LINUX64-LABEL: and16_trunc_8_sign: ; CHECK-LINUX64: # %bb.0: -; CHECK-LINUX64-NEXT: andl $128, %edi -; CHECK-LINUX64-NEXT: testb %dil, %dil +; CHECK-LINUX64-NEXT: testb $-128, %dil ; CHECK-LINUX64-NEXT: jg .LBB13_2 ; CHECK-LINUX64-NEXT: # %bb.1: # %yes ; CHECK-LINUX64-NEXT: pushq %rax @@ -592,8 +591,7 @@ define void @and16_trunc_8_sign(i16 %x) nounwind { ; CHECK-WIN32-64: # %bb.0: ; CHECK-WIN32-64-NEXT: subq $40, %rsp ; CHECK-WIN32-64-NEXT: # kill: def $cx killed $cx def $ecx -; CHECK-WIN32-64-NEXT: andl $128, %ecx -; CHECK-WIN32-64-NEXT: testb %cl, %cl +; CHECK-WIN32-64-NEXT: testb $-128, %cl ; CHECK-WIN32-64-NEXT: jg .LBB13_2 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes ; CHECK-WIN32-64-NEXT: callq bar @@ -604,8 +602,7 @@ define void @and16_trunc_8_sign(i16 %x) nounwind { ; CHECK-X86-LABEL: and16_trunc_8_sign: ; CHECK-X86: # %bb.0: ; CHECK-X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; CHECK-X86-NEXT: andl $128, %eax -; CHECK-X86-NEXT: testb %al, %al +; CHECK-X86-NEXT: testb $-128, %al ; CHECK-X86-NEXT: jg .LBB13_2 ; CHECK-X86-NEXT: # %bb.1: # %yes ; CHECK-X86-NEXT: calll bar @@ -626,8 +623,7 @@ no: define void @and32_trunc_8_sign(i32 %x) nounwind { ; CHECK-LINUX64-LABEL: and32_trunc_8_sign: ; CHECK-LINUX64: # %bb.0: -; CHECK-LINUX64-NEXT: andl $128, %edi -; CHECK-LINUX64-NEXT: testb %dil, %dil +; CHECK-LINUX64-NEXT: testb $-128, %dil ; CHECK-LINUX64-NEXT: jg .LBB14_2 ; CHECK-LINUX64-NEXT: # %bb.1: # %yes ; CHECK-LINUX64-NEXT: pushq %rax @@ -639,8 +635,7 @@ define void @and32_trunc_8_sign(i32 %x) nounwind { ; CHECK-WIN32-64-LABEL: and32_trunc_8_sign: ; CHECK-WIN32-64: # %bb.0: ; CHECK-WIN32-64-NEXT: subq $40, %rsp -; CHECK-WIN32-64-NEXT: andl $128, %ecx -; CHECK-WIN32-64-NEXT: testb %cl, %cl +; CHECK-WIN32-64-NEXT: testb $-128, %cl ; CHECK-WIN32-64-NEXT: jg .LBB14_2 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes ; CHECK-WIN32-64-NEXT: callq bar @@ -650,9 +645,8 @@ define void @and32_trunc_8_sign(i32 %x) nounwind { ; ; CHECK-X86-LABEL: and32_trunc_8_sign: ; CHECK-X86: # %bb.0: -; CHECK-X86-NEXT: movl $128, %eax -; CHECK-X86-NEXT: andl {{[0-9]+}}(%esp), %eax -; CHECK-X86-NEXT: testb %al, %al +; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; CHECK-X86-NEXT: testb $-128, %al ; CHECK-X86-NEXT: jg .LBB14_2 ; CHECK-X86-NEXT: # %bb.1: # %yes ; CHECK-X86-NEXT: calll bar @@ -673,8 +667,7 @@ no: define void @and64_trunc_8_sign(i64 %x) nounwind { ; CHECK-LINUX64-LABEL: and64_trunc_8_sign: ; CHECK-LINUX64: # %bb.0: -; CHECK-LINUX64-NEXT: andl $128, %edi -; CHECK-LINUX64-NEXT: testb %dil, %dil +; CHECK-LINUX64-NEXT: testb $-128, %dil ; CHECK-LINUX64-NEXT: jg .LBB15_2 ; CHECK-LINUX64-NEXT: # %bb.1: # %yes ; CHECK-LINUX64-NEXT: pushq %rax @@ -686,8 +679,7 @@ define void @and64_trunc_8_sign(i64 %x) nounwind { ; CHECK-WIN32-64-LABEL: and64_trunc_8_sign: ; CHECK-WIN32-64: # %bb.0: ; CHECK-WIN32-64-NEXT: subq $40, %rsp -; CHECK-WIN32-64-NEXT: andl $128, %ecx -; CHECK-WIN32-64-NEXT: testb %cl, %cl +; CHECK-WIN32-64-NEXT: testb $-128, %cl ; CHECK-WIN32-64-NEXT: jg .LBB15_2 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes ; CHECK-WIN32-64-NEXT: callq bar @@ -697,9 +689,8 @@ define void @and64_trunc_8_sign(i64 %x) nounwind { ; ; CHECK-X86-LABEL: and64_trunc_8_sign: ; CHECK-X86: # %bb.0: -; CHECK-X86-NEXT: movl $128, %eax -; CHECK-X86-NEXT: andl {{[0-9]+}}(%esp), %eax -; CHECK-X86-NEXT: testb %al, %al +; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; CHECK-X86-NEXT: testb $-128, %al ; CHECK-X86-NEXT: jg .LBB15_2 ; CHECK-X86-NEXT: # %bb.1: # %yes ; CHECK-X86-NEXT: calll bar @@ -767,8 +758,7 @@ no: define void @and32_trunc_16_sign_minsize(i32 %x) minsize nounwind { ; CHECK-LINUX64-LABEL: and32_trunc_16_sign_minsize: ; CHECK-LINUX64: # %bb.0: -; CHECK-LINUX64-NEXT: andl $32768, %edi # imm = 0x8000 -; CHECK-LINUX64-NEXT: testw %di, %di +; CHECK-LINUX64-NEXT: testw $-32768, %di # imm = 0x8000 ; CHECK-LINUX64-NEXT: jg .LBB17_2 ; CHECK-LINUX64-NEXT: # %bb.1: # %yes ; CHECK-LINUX64-NEXT: pushq %rax @@ -780,8 +770,7 @@ define void @and32_trunc_16_sign_minsize(i32 %x) minsize nounwind { ; CHECK-WIN32-64-LABEL: and32_trunc_16_sign_minsize: ; CHECK-WIN32-64: # %bb.0: ; CHECK-WIN32-64-NEXT: subq $40, %rsp -; CHECK-WIN32-64-NEXT: andl $32768, %ecx # imm = 0x8000 -; CHECK-WIN32-64-NEXT: testw %cx, %cx +; CHECK-WIN32-64-NEXT: testw $-32768, %cx # imm = 0x8000 ; CHECK-WIN32-64-NEXT: jg .LBB17_2 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes ; CHECK-WIN32-64-NEXT: callq bar @@ -791,9 +780,8 @@ define void @and32_trunc_16_sign_minsize(i32 %x) minsize nounwind { ; ; CHECK-X86-LABEL: and32_trunc_16_sign_minsize: ; CHECK-X86: # %bb.0: -; CHECK-X86-NEXT: movl $32768, %eax # imm = 0x8000 -; CHECK-X86-NEXT: andl {{[0-9]+}}(%esp), %eax -; CHECK-X86-NEXT: testw %ax, %ax +; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; CHECK-X86-NEXT: testw $-32768, %ax # imm = 0x8000 ; CHECK-X86-NEXT: jg .LBB17_2 ; CHECK-X86-NEXT: # %bb.1: # %yes ; CHECK-X86-NEXT: calll bar @@ -861,8 +849,7 @@ no: define void @and64_trunc_16_sign_minsize(i64 %x) minsize nounwind { ; CHECK-LINUX64-LABEL: and64_trunc_16_sign_minsize: ; CHECK-LINUX64: # %bb.0: -; CHECK-LINUX64-NEXT: andl $32768, %edi # imm = 0x8000 -; CHECK-LINUX64-NEXT: testw %di, %di +; CHECK-LINUX64-NEXT: testw $-32768, %di # imm = 0x8000 ; CHECK-LINUX64-NEXT: jg .LBB19_2 ; CHECK-LINUX64-NEXT: # %bb.1: # %yes ; CHECK-LINUX64-NEXT: pushq %rax @@ -874,8 +861,7 @@ define void @and64_trunc_16_sign_minsize(i64 %x) minsize nounwind { ; CHECK-WIN32-64-LABEL: and64_trunc_16_sign_minsize: ; CHECK-WIN32-64: # %bb.0: ; CHECK-WIN32-64-NEXT: subq $40, %rsp -; CHECK-WIN32-64-NEXT: andl $32768, %ecx # imm = 0x8000 -; CHECK-WIN32-64-NEXT: testw %cx, %cx +; CHECK-WIN32-64-NEXT: testw $-32768, %cx # imm = 0x8000 ; CHECK-WIN32-64-NEXT: jg .LBB19_2 ; CHECK-WIN32-64-NEXT: # %bb.1: # %yes ; CHECK-WIN32-64-NEXT: callq bar @@ -885,9 +871,8 @@ define void @and64_trunc_16_sign_minsize(i64 %x) minsize nounwind { ; ; CHECK-X86-LABEL: and64_trunc_16_sign_minsize: ; CHECK-X86: # %bb.0: -; CHECK-X86-NEXT: movl $32768, %eax # imm = 0x8000 -; CHECK-X86-NEXT: andl {{[0-9]+}}(%esp), %eax -; CHECK-X86-NEXT: testw %ax, %ax +; CHECK-X86-NEXT: movl {{[0-9]+}}(%esp), %eax +; CHECK-X86-NEXT: testw $-32768, %ax # imm = 0x8000 ; CHECK-X86-NEXT: jg .LBB19_2 ; CHECK-X86-NEXT: # %bb.1: # %yes ; CHECK-X86-NEXT: calll bar |