diff options
author | Craig Topper <craig.topper@intel.com> | 2018-09-28 19:06:28 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2018-09-28 19:06:28 +0000 |
commit | 98aa64342046d70105f031a13daac816f9e55943 (patch) | |
tree | 1ea59b2071cc3facc2c463b40e9ed235c722fc5e /llvm/test | |
parent | fc1852ff1cbdcdb69d82b97a9143a8069668efe0 (diff) | |
download | bcm5719-llvm-98aa64342046d70105f031a13daac816f9e55943.tar.gz bcm5719-llvm-98aa64342046d70105f031a13daac816f9e55943.zip |
[X86] Add test cases for failures to use narrow test with immediate instructions when a truncate is beteen the CMP and the AND and the sign flag is used.
The code in X86ISelDAGToDAG only looks through truncates if the sign flag isn't used, but that is overly restrictive. A future patch will improve this.
llvm-svn: 343355
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/CodeGen/X86/test-shrink.ll | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/test-shrink.ll b/llvm/test/CodeGen/X86/test-shrink.ll index 5a5981462a5..c83e7fa8322 100644 --- a/llvm/test/CodeGen/X86/test-shrink.ll +++ b/llvm/test/CodeGen/X86/test-shrink.ll @@ -575,4 +575,240 @@ no: ret void } +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: jg .LBB13_2 +; CHECK-LINUX64-NEXT: # %bb.1: # %yes +; CHECK-LINUX64-NEXT: pushq %rax +; CHECK-LINUX64-NEXT: callq bar +; CHECK-LINUX64-NEXT: popq %rax +; CHECK-LINUX64-NEXT: .LBB13_2: # %no +; CHECK-LINUX64-NEXT: retq +; +; CHECK-WIN32-64-LABEL: and16_trunc_8_sign: +; 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: jg .LBB13_2 +; CHECK-WIN32-64-NEXT: # %bb.1: # %yes +; CHECK-WIN32-64-NEXT: callq bar +; CHECK-WIN32-64-NEXT: .LBB13_2: # %no +; CHECK-WIN32-64-NEXT: addq $40, %rsp +; CHECK-WIN32-64-NEXT: retq +; +; 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: jg .LBB13_2 +; CHECK-X86-NEXT: # %bb.1: # %yes +; CHECK-X86-NEXT: calll bar +; CHECK-X86-NEXT: .LBB13_2: # %no +; CHECK-X86-NEXT: retl + %t = and i16 %x, 128 + %r = trunc i16 %t to i8 + %s = icmp sle i8 %r, 0 + br i1 %s, label %yes, label %no + +yes: + call void @bar() + ret void +no: + ret void +} + +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: jg .LBB14_2 +; CHECK-LINUX64-NEXT: # %bb.1: # %yes +; CHECK-LINUX64-NEXT: pushq %rax +; CHECK-LINUX64-NEXT: callq bar +; CHECK-LINUX64-NEXT: popq %rax +; CHECK-LINUX64-NEXT: .LBB14_2: # %no +; CHECK-LINUX64-NEXT: retq +; +; 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: jg .LBB14_2 +; CHECK-WIN32-64-NEXT: # %bb.1: # %yes +; CHECK-WIN32-64-NEXT: callq bar +; CHECK-WIN32-64-NEXT: .LBB14_2: # %no +; CHECK-WIN32-64-NEXT: addq $40, %rsp +; CHECK-WIN32-64-NEXT: retq +; +; 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: jg .LBB14_2 +; CHECK-X86-NEXT: # %bb.1: # %yes +; CHECK-X86-NEXT: calll bar +; CHECK-X86-NEXT: .LBB14_2: # %no +; CHECK-X86-NEXT: retl + %t = and i32 %x, 128 + %r = trunc i32 %t to i8 + %s = icmp sle i8 %r, 0 + br i1 %s, label %yes, label %no + +yes: + call void @bar() + ret void +no: + ret void +} + +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: jg .LBB15_2 +; CHECK-LINUX64-NEXT: # %bb.1: # %yes +; CHECK-LINUX64-NEXT: pushq %rax +; CHECK-LINUX64-NEXT: callq bar +; CHECK-LINUX64-NEXT: popq %rax +; CHECK-LINUX64-NEXT: .LBB15_2: # %no +; CHECK-LINUX64-NEXT: retq +; +; 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: jg .LBB15_2 +; CHECK-WIN32-64-NEXT: # %bb.1: # %yes +; CHECK-WIN32-64-NEXT: callq bar +; CHECK-WIN32-64-NEXT: .LBB15_2: # %no +; CHECK-WIN32-64-NEXT: addq $40, %rsp +; CHECK-WIN32-64-NEXT: retq +; +; 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: jg .LBB15_2 +; CHECK-X86-NEXT: # %bb.1: # %yes +; CHECK-X86-NEXT: calll bar +; CHECK-X86-NEXT: .LBB15_2: # %no +; CHECK-X86-NEXT: retl + %t = and i64 %x, 128 + %r = trunc i64 %t to i8 + %s = icmp sle i8 %r, 0 + br i1 %s, label %yes, label %no + +yes: + call void @bar() + ret void +no: + ret void +} + +define void @and32_trunc_16_sign(i32 %x) minsize nounwind { +; CHECK-LINUX64-LABEL: and32_trunc_16_sign: +; CHECK-LINUX64: # %bb.0: +; CHECK-LINUX64-NEXT: andl $32768, %edi # imm = 0x8000 +; CHECK-LINUX64-NEXT: testw %di, %di +; CHECK-LINUX64-NEXT: jg .LBB16_2 +; CHECK-LINUX64-NEXT: # %bb.1: # %yes +; CHECK-LINUX64-NEXT: pushq %rax +; CHECK-LINUX64-NEXT: callq bar +; CHECK-LINUX64-NEXT: popq %rax +; CHECK-LINUX64-NEXT: .LBB16_2: # %no +; CHECK-LINUX64-NEXT: retq +; +; CHECK-WIN32-64-LABEL: and32_trunc_16_sign: +; 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: jg .LBB16_2 +; CHECK-WIN32-64-NEXT: # %bb.1: # %yes +; CHECK-WIN32-64-NEXT: callq bar +; CHECK-WIN32-64-NEXT: .LBB16_2: # %no +; CHECK-WIN32-64-NEXT: addq $40, %rsp +; CHECK-WIN32-64-NEXT: retq +; +; CHECK-X86-LABEL: and32_trunc_16_sign: +; 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: jg .LBB16_2 +; CHECK-X86-NEXT: # %bb.1: # %yes +; CHECK-X86-NEXT: calll bar +; CHECK-X86-NEXT: .LBB16_2: # %no +; CHECK-X86-NEXT: retl + %t = and i32 %x, 32768 + %r = trunc i32 %t to i16 + %s = icmp sle i16 %r, 0 + br i1 %s, label %yes, label %no + +yes: + call void @bar() + ret void +no: + ret void +} + +define void @and64_trunc_32_sign(i64 %x) minsize nounwind { +; CHECK-LINUX64-LABEL: and64_trunc_32_sign: +; CHECK-LINUX64: # %bb.0: +; CHECK-LINUX64-NEXT: andl $32768, %edi # imm = 0x8000 +; CHECK-LINUX64-NEXT: testw %di, %di +; CHECK-LINUX64-NEXT: jg .LBB17_2 +; CHECK-LINUX64-NEXT: # %bb.1: # %yes +; CHECK-LINUX64-NEXT: pushq %rax +; CHECK-LINUX64-NEXT: callq bar +; CHECK-LINUX64-NEXT: popq %rax +; CHECK-LINUX64-NEXT: .LBB17_2: # %no +; CHECK-LINUX64-NEXT: retq +; +; CHECK-WIN32-64-LABEL: and64_trunc_32_sign: +; 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: jg .LBB17_2 +; CHECK-WIN32-64-NEXT: # %bb.1: # %yes +; CHECK-WIN32-64-NEXT: callq bar +; CHECK-WIN32-64-NEXT: .LBB17_2: # %no +; CHECK-WIN32-64-NEXT: addq $40, %rsp +; CHECK-WIN32-64-NEXT: retq +; +; CHECK-X86-LABEL: and64_trunc_32_sign: +; 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: jg .LBB17_2 +; CHECK-X86-NEXT: # %bb.1: # %yes +; CHECK-X86-NEXT: calll bar +; CHECK-X86-NEXT: .LBB17_2: # %no +; CHECK-X86-NEXT: retl + %t = and i64 %x, 32768 + %r = trunc i64 %t to i16 + %s = icmp sle i16 %r, 0 + br i1 %s, label %yes, label %no + +yes: + call void @bar() + ret void +no: + ret void +} + declare void @bar() |