1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 10:42:39 +01:00
llvm-mirror/test/CodeGen/PowerPC/pr30663.ll
Tim Shen 97a4f6a6e9 [PPCMIPeephole] Fix splat elimination
Summary:
In PPCMIPeephole, when we see two splat instructions, we can't simply do the following transformation:
  B = Splat A
  C = Splat B
=>
  C = Splat A
because B may still be used between these two instructions. Instead, we should make the second Splat a PPC::COPY and let later passes decide whether to remove it or not:
  B = Splat A
  C = Splat B
=>
  B = Splat A
  C = COPY B

Fixes PR30663.

Reviewers: echristo, iteratee, kbarton, nemanjai

Subscribers: mehdi_amini, llvm-commits

Differential Revision: https://reviews.llvm.org/D25493

llvm-svn: 283961
2016-10-12 00:48:25 +00:00

25 lines
1.0 KiB
LLVM

; RUN: llc -O1 < %s | FileCheck %s
target triple = "powerpc64le-linux-gnu"
; The second xxspltw should be eliminated.
; CHECK: xxspltw
; CHECK-NOT: xxspltw
define void @Test() {
bb4:
%tmp = load <4 x i8>, <4 x i8>* undef
%tmp8 = bitcast <4 x i8> %tmp to float
%tmp18 = fmul float %tmp8, undef
%tmp19 = fsub float 0.000000e+00, %tmp18
store float %tmp19, float* undef
%tmp22 = shufflevector <4 x i8> %tmp, <4 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
%tmp23 = bitcast <16 x i8> %tmp22 to <4 x float>
%tmp25 = tail call <4 x float> @llvm.fma.v4f32(<4 x float> undef, <4 x float> %tmp23, <4 x float> undef)
%tmp26 = fsub <4 x float> zeroinitializer, %tmp25
%tmp27 = bitcast <4 x float> %tmp26 to <4 x i32>
tail call void @llvm.ppc.altivec.stvx(<4 x i32> %tmp27, i8* undef)
ret void
}
declare void @llvm.ppc.altivec.stvx(<4 x i32>, i8*)
declare <4 x float> @llvm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>)