diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-04-16 16:01:22 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-04-16 16:01:22 +0000 |
commit | 71d5a2540a98c81f5bcaeb48805e0e2881f530ef (patch) | |
tree | 5343938942df402b49ec7300a1c25a2d4ccd5821 /test/CodeGen/X86/copy-propagation.ll | |
parent | 31bbf64f3a4974a2d6c8b3b27ad2f519caf74057 (diff) |
Diffstat (limited to 'test/CodeGen/X86/copy-propagation.ll')
-rw-r--r-- | test/CodeGen/X86/copy-propagation.ll | 33 |
1 files changed, 10 insertions, 23 deletions
diff --git a/test/CodeGen/X86/copy-propagation.ll b/test/CodeGen/X86/copy-propagation.ll index dac46c173825..4d8b8462b5fa 100644 --- a/test/CodeGen/X86/copy-propagation.ll +++ b/test/CodeGen/X86/copy-propagation.ll @@ -1,38 +1,25 @@ ; RUN: llc %s -mattr=+avx -o - | FileCheck %s -; PR21743. +; Originally from http://llvm.org/PR21743. target triple = "x86_64-pc-win32-elf" -; Check that copy propagation conservatively assumes that undef register -; can be rewritten by the backend to break false dependencies for the -; hardware. -; In this function we are in this situation: -; reg1 = copy reg2 -; = inst reg2<undef> -; reg2 = copy reg1 -; Copy propagation used to remove the last copy. -; This is incorrect because the undef flag on reg2 in inst, allows next -; passes to put whatever trashed value in reg2 that may help. -; In practice we end up with this code: -; reg1 = copy reg2 -; reg2 = 0 -; = inst reg2<undef> -; reg2 = copy reg1 -; Therefore, removing the last copy is wrong. +; Copy propagation may remove COPYs if the result is only used by undef +; operands. ; ; CHECK-LABEL: foo: ; CHECK: movl $339752784, %e[[INDIRECT_CALL1:[a-z]+]] ; CHECK: callq *%r[[INDIRECT_CALL1]] ; Copy the result in a temporary. -; Note: Technically the regalloc could have been smarter and this move not required, -; which would have hidden the bug. +; Note: Technically the regalloc could have been smarter and this move not +; required, which would have hidden the bug. ; CHECK: vmovapd %xmm0, [[TMP:%xmm[0-9]+]] -; Crush xmm0. -; CHECK-NEXT: vxorps %xmm0, %xmm0, %xmm0 +; CHECK-NOT: vxorps %xmm0, %xmm0, %xmm0 +; CHECK-NEXT: vcvtsi2sdq %rsi, %xmm0, %xmm6 ; CHECK: movl $339772768, %e[[INDIRECT_CALL2:[a-z]+]] +; CHECK-NOT: vmovapd %xmm7, %xmm0 +; CHECK-NEXT: vmovapd %xmm6, %xmm1 ; Set TMP in the first argument of the second call. -; CHECK-NEXT: vmovapd [[TMP]], %xmm0 -; CHECK: callq *%r[[INDIRECT_CALL2]] +; CHECK_NEXT: callq *%r[[INDIRECT_CALL2]] ; CHECK: retq define double @foo(i64 %arg) { top: |