mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Fix a bug in the legalization of vector anyext-load and trunc-store. Mem Index starts with zero.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142434 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e482471402
commit
fbf19ef186
@ -298,6 +298,7 @@ SDValue VectorLegalizer::ExpandLoad(SDValue Op) {
|
|||||||
SDValue Chain = LD->getChain();
|
SDValue Chain = LD->getChain();
|
||||||
SDValue BasePTR = LD->getBasePtr();
|
SDValue BasePTR = LD->getBasePtr();
|
||||||
EVT SrcVT = LD->getMemoryVT();
|
EVT SrcVT = LD->getMemoryVT();
|
||||||
|
ISD::LoadExtType ExtType = LD->getExtensionType();
|
||||||
|
|
||||||
SmallVector<SDValue, 8> LoadVals;
|
SmallVector<SDValue, 8> LoadVals;
|
||||||
SmallVector<SDValue, 8> LoadChains;
|
SmallVector<SDValue, 8> LoadChains;
|
||||||
@ -305,19 +306,20 @@ SDValue VectorLegalizer::ExpandLoad(SDValue Op) {
|
|||||||
unsigned Stride = SrcVT.getScalarType().getSizeInBits()/8;
|
unsigned Stride = SrcVT.getScalarType().getSizeInBits()/8;
|
||||||
|
|
||||||
for (unsigned Idx=0; Idx<NumElem; Idx++) {
|
for (unsigned Idx=0; Idx<NumElem; Idx++) {
|
||||||
BasePTR = DAG.getNode(ISD::ADD, dl, BasePTR.getValueType(), BasePTR,
|
SDValue ScalarLoad = DAG.getExtLoad(ExtType, dl,
|
||||||
DAG.getIntPtrConstant(Stride));
|
|
||||||
SDValue ScalarLoad = DAG.getExtLoad(ISD::EXTLOAD, dl,
|
|
||||||
Op.getNode()->getValueType(0).getScalarType(),
|
Op.getNode()->getValueType(0).getScalarType(),
|
||||||
Chain, BasePTR, LD->getPointerInfo().getWithOffset(Idx * Stride),
|
Chain, BasePTR, LD->getPointerInfo().getWithOffset(Idx * Stride),
|
||||||
SrcVT.getScalarType(),
|
SrcVT.getScalarType(),
|
||||||
LD->isVolatile(), LD->isNonTemporal(),
|
LD->isVolatile(), LD->isNonTemporal(),
|
||||||
LD->getAlignment());
|
LD->getAlignment());
|
||||||
|
|
||||||
|
BasePTR = DAG.getNode(ISD::ADD, dl, BasePTR.getValueType(), BasePTR,
|
||||||
|
DAG.getIntPtrConstant(Stride));
|
||||||
|
|
||||||
LoadVals.push_back(ScalarLoad.getValue(0));
|
LoadVals.push_back(ScalarLoad.getValue(0));
|
||||||
LoadChains.push_back(ScalarLoad.getValue(1));
|
LoadChains.push_back(ScalarLoad.getValue(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
SDValue NewChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
|
SDValue NewChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
|
||||||
&LoadChains[0], LoadChains.size());
|
&LoadChains[0], LoadChains.size());
|
||||||
SDValue Value = DAG.getNode(ISD::BUILD_VECTOR, dl,
|
SDValue Value = DAG.getNode(ISD::BUILD_VECTOR, dl,
|
||||||
@ -364,14 +366,14 @@ SDValue VectorLegalizer::ExpandStore(SDValue Op) {
|
|||||||
SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
|
SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
|
||||||
RegSclVT, Value, DAG.getIntPtrConstant(Idx));
|
RegSclVT, Value, DAG.getIntPtrConstant(Idx));
|
||||||
|
|
||||||
BasePTR = DAG.getNode(ISD::ADD, dl, BasePTR.getValueType(), BasePTR,
|
|
||||||
DAG.getIntPtrConstant(Stride));
|
|
||||||
|
|
||||||
// This scalar TruncStore may be illegal, but we legalize it later.
|
// This scalar TruncStore may be illegal, but we legalize it later.
|
||||||
SDValue Store = DAG.getTruncStore(Chain, dl, Ex, BasePTR,
|
SDValue Store = DAG.getTruncStore(Chain, dl, Ex, BasePTR,
|
||||||
ST->getPointerInfo().getWithOffset(Idx*Stride), MemSclVT,
|
ST->getPointerInfo().getWithOffset(Idx*Stride), MemSclVT,
|
||||||
isVolatile, isNonTemporal, Alignment);
|
isVolatile, isNonTemporal, Alignment);
|
||||||
|
|
||||||
|
BasePTR = DAG.getNode(ISD::ADD, dl, BasePTR.getValueType(), BasePTR,
|
||||||
|
DAG.getIntPtrConstant(Stride));
|
||||||
|
|
||||||
Stores.push_back(Store);
|
Stores.push_back(Store);
|
||||||
}
|
}
|
||||||
SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
|
SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
|
||||||
|
28
test/CodeGen/X86/2011-10-19-LegelizeLoad.ll
Normal file
28
test/CodeGen/X86/2011-10-19-LegelizeLoad.ll
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s
|
||||||
|
|
||||||
|
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i8:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
||||||
|
target triple = "x86_64-unknown-linux-gnu"
|
||||||
|
|
||||||
|
%union.anon = type { <2 x i8> }
|
||||||
|
|
||||||
|
@i = global <2 x i8> <i8 150, i8 100>, align 8
|
||||||
|
@j = global <2 x i8> <i8 10, i8 13>, align 8
|
||||||
|
@res = common global %union.anon zeroinitializer, align 8
|
||||||
|
|
||||||
|
; Make sure we load the constants i and j starting offset zero.
|
||||||
|
; Also make sure that we sign-extend it.
|
||||||
|
; Based on /gcc-4_2-testsuite/src/gcc.c-torture/execute/pr23135.c
|
||||||
|
|
||||||
|
; CHECK: main
|
||||||
|
define i32 @main() nounwind uwtable {
|
||||||
|
entry:
|
||||||
|
; CHECK: movsbq j(%rip), %
|
||||||
|
; CHECK: movsbq i(%rip), %
|
||||||
|
%0 = load <2 x i8>* @i, align 8
|
||||||
|
%1 = load <2 x i8>* @j, align 8
|
||||||
|
%div = sdiv <2 x i8> %1, %0
|
||||||
|
store <2 x i8> %div, <2 x i8>* getelementptr inbounds (%union.anon* @res, i32 0, i32 0), align 8
|
||||||
|
ret i32 0
|
||||||
|
; CHECK: ret
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user