mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
97a4f6a6e9
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
25 lines
1.0 KiB
LLVM
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>)
|