mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
[DAGCombiner] Fix ReplaceExtractVectorEltOfLoadWithNarrowedLoad for BE
For little-endian, the function would convert (extract_vector_elt (load X), Y) to X + Y*sizeof(elt). For big-endian it would instead use X + sizeof(vec) - Y*sizeof(elt). The big-endian case wasn't right since vector index order always follows memory/array order, even for big-endian. (Note that the current handling has to be wrong for Y==0 since it would access beyond the end of the vector.) Original patch by Richard Sandiford. llvm-svn: 236529
This commit is contained in:
parent
aab0c45488
commit
8229aae81f
@ -11413,19 +11413,12 @@ SDValue DAGCombiner::ReplaceExtractVectorEltOfLoadWithNarrowedLoad(
|
||||
if (auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo)) {
|
||||
int Elt = ConstEltNo->getZExtValue();
|
||||
unsigned PtrOff = VecEltVT.getSizeInBits() * Elt / 8;
|
||||
if (TLI.isBigEndian())
|
||||
PtrOff = InVecVT.getSizeInBits() / 8 - PtrOff;
|
||||
Offset = DAG.getConstant(PtrOff, DL, PtrType);
|
||||
MPI = OriginalLoad->getPointerInfo().getWithOffset(PtrOff);
|
||||
} else {
|
||||
Offset = DAG.getNode(
|
||||
ISD::MUL, DL, EltNo.getValueType(), EltNo,
|
||||
DAG.getConstant(VecEltVT.getStoreSize(), DL, EltNo.getValueType()));
|
||||
if (TLI.isBigEndian())
|
||||
Offset = DAG.getNode(
|
||||
ISD::SUB, DL, EltNo.getValueType(),
|
||||
DAG.getConstant(InVecVT.getStoreSize(), DL, EltNo.getValueType()),
|
||||
Offset);
|
||||
MPI = OriginalLoad->getPointerInfo();
|
||||
}
|
||||
NewPtr = DAG.getNode(ISD::ADD, DL, PtrType, NewPtr, Offset);
|
||||
|
13
test/CodeGen/SystemZ/vec-extract-01.ll
Normal file
13
test/CodeGen/SystemZ/vec-extract-01.ll
Normal file
@ -0,0 +1,13 @@
|
||||
; Verify ReplaceExtractVectorEltOfLoadWithNarrowedLoad fixes
|
||||
;
|
||||
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
|
||||
|
||||
; Test a memory copy of a v2i32 (via the constant pool).
|
||||
define void @f1(<2 x i32> *%dest) {
|
||||
; CHECK-LABEL: f1:
|
||||
; CHECK: lgrl [[REG:%r[0-5]]], {{[._A-Za-z0-9]}}
|
||||
; CHECK: stg [[REG]], 0(%r2)
|
||||
; CHECK: br %r14
|
||||
store <2 x i32> <i32 1000000, i32 99999>, <2 x i32> *%dest
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user