mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-09 05:31:19 +00:00
e541870740
Given certain shuffle-vector masks, LLVM emits splat instructions which splat the wrong bytes from the source register. The issue is that the function PPC::isSplatShuffleMask() in PPCISelLowering.cpp does not ensure that the splat pattern found is requesting bytes that are aligned on an EltSize boundary. This patch detects this situation as not a valid splat mask, resulting in a permute being generated instead of a splat. Patch and test case by Tyler Kenney, cleaned up a bit by me. This is a simple bug fix that would be good to incorporate into 3.7. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243519 91177308-0d34-0410-b5e6-96231b3b80d8
15 lines
526 B
LLVM
15 lines
526 B
LLVM
; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
|
|
|
|
; Test case adapted from PR24216.
|
|
|
|
define void @foo(<16 x i8>* nocapture readonly %in, <16 x i8>* nocapture %out) {
|
|
entry:
|
|
%0 = load <16 x i8>, <16 x i8>* %in, align 16
|
|
%1 = shufflevector <16 x i8> %0, <16 x i8> undef, <16 x i32> <i32 2, i32 3, i32 4, i32 5, i32 2, i32 3, i32 4, i32 5, i32 2, i32 3, i32 4, i32 5, i32 2, i32 3, i32 4, i32 5>
|
|
store <16 x i8> %1, <16 x i8>* %out, align 16
|
|
ret void
|
|
}
|
|
|
|
; CHECK: vperm
|
|
; CHECK-NOT: vspltw
|