mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Fix PR13859
- Preserve the original NOutVT during casting from vector to integer by extracting vector elements. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@164042 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9bb938c540
commit
bb73002247
@ -95,17 +95,18 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {
|
||||
// Handle cases like i64 = BITCAST v1i64 on x86, where the operand
|
||||
// is legal but the result is not.
|
||||
unsigned NumElems = 2;
|
||||
EVT NVT = EVT::getVectorVT(*DAG.getContext(), NOutVT, NumElems);
|
||||
EVT ElemVT = NOutVT;
|
||||
EVT NVT = EVT::getVectorVT(*DAG.getContext(), ElemVT, NumElems);
|
||||
|
||||
// If <NOutVT * N> is not a legal type, try <NOutVT/2 * (N*2)>.
|
||||
// If <ElemVT * N> is not a legal type, try <ElemVT/2 * (N*2)>.
|
||||
while (!isTypeLegal(NVT)) {
|
||||
unsigned NewSizeInBits = NOutVT.getSizeInBits() / 2;
|
||||
unsigned NewSizeInBits = ElemVT.getSizeInBits() / 2;
|
||||
// If the element size is smaller than byte, bail.
|
||||
if (NewSizeInBits < 8)
|
||||
break;
|
||||
NumElems *= 2;
|
||||
NOutVT = EVT::getIntegerVT(*DAG.getContext(), NewSizeInBits);
|
||||
NVT = EVT::getVectorVT(*DAG.getContext(), NOutVT, NumElems);
|
||||
ElemVT = EVT::getIntegerVT(*DAG.getContext(), NewSizeInBits);
|
||||
NVT = EVT::getVectorVT(*DAG.getContext(), ElemVT, NumElems);
|
||||
}
|
||||
|
||||
if (isTypeLegal(NVT)) {
|
||||
@ -113,7 +114,7 @@ void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {
|
||||
|
||||
SmallVector<SDValue, 8> Vals;
|
||||
for (unsigned i = 0; i < NumElems; ++i)
|
||||
Vals.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NOutVT,
|
||||
Vals.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ElemVT,
|
||||
CastInOp, DAG.getIntPtrConstant(i)));
|
||||
|
||||
// Build Lo, Hi pair by pairing extracted elements if needed.
|
||||
|
28
test/CodeGen/X86/pr13859.ll
Normal file
28
test/CodeGen/X86/pr13859.ll
Normal file
@ -0,0 +1,28 @@
|
||||
; RUN: llc < %s
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32-S128"
|
||||
target triple = "i386-apple-macosx10.7.0"
|
||||
|
||||
define void @_Z17FilterYUVRows_MMXi(i32 %af) nounwind ssp {
|
||||
entry:
|
||||
%aMyAlloca = alloca i32, align 32
|
||||
%dest = alloca <1 x i64>, align 32
|
||||
|
||||
%a32 = load i32* %aMyAlloca, align 4
|
||||
%aconv = trunc i32 %a32 to i16
|
||||
%a36 = insertelement <4 x i16> undef, i16 %aconv, i32 0
|
||||
%a37 = insertelement <4 x i16> %a36, i16 %aconv, i32 1
|
||||
%a38 = insertelement <4 x i16> %a37, i16 %aconv, i32 2
|
||||
%a39 = insertelement <4 x i16> %a38, i16 %aconv, i32 3
|
||||
%a40 = bitcast <4 x i16> %a39 to x86_mmx
|
||||
%a41 = bitcast x86_mmx %a40 to <1 x i64>
|
||||
|
||||
%a47 = trunc i32 %a32 to i1
|
||||
br i1 %a47, label %a48, label %a49
|
||||
|
||||
a48:
|
||||
unreachable
|
||||
|
||||
a49:
|
||||
store <1 x i64> %a41, <1 x i64>* %dest, align 8 ; !!!
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user