mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Make InstCombineCasts.cpp:OptimizeIntToFloatBitCast endian safe.
The OptimizeIntToFloatBitCast converts shift-truncate sequences into extractelement operations. The computation of the element index to be used in the resulting operation is currently only correct for little-endian targets. This commit fixes the element index computation to be correct for big-endian targets as well. If the target byte order is unknown, the optimization cannot be performed at all. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178031 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a8c8c45838
commit
fdc6177490
@ -1610,6 +1610,9 @@ static Value *OptimizeIntegerToVectorInsertions(BitCastInst &CI,
|
||||
/// OptimizeIntToFloatBitCast - See if we can optimize an integer->float/double
|
||||
/// bitcast. The various long double bitcasts can't get in here.
|
||||
static Instruction *OptimizeIntToFloatBitCast(BitCastInst &CI,InstCombiner &IC){
|
||||
// We need to know the target byte order to perform this optimization.
|
||||
if (!IC.getDataLayout()) return 0;
|
||||
|
||||
Value *Src = CI.getOperand(0);
|
||||
Type *DestTy = CI.getType();
|
||||
|
||||
@ -1631,7 +1634,10 @@ static Instruction *OptimizeIntToFloatBitCast(BitCastInst &CI,InstCombiner &IC){
|
||||
VecInput = IC.Builder->CreateBitCast(VecInput, VecTy);
|
||||
}
|
||||
|
||||
return ExtractElementInst::Create(VecInput, IC.Builder->getInt32(0));
|
||||
unsigned Elt = 0;
|
||||
if (IC.getDataLayout()->isBigEndian())
|
||||
Elt = VecTy->getPrimitiveSizeInBits() / DestWidth - 1;
|
||||
return ExtractElementInst::Create(VecInput, IC.Builder->getInt32(Elt));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1653,6 +1659,8 @@ static Instruction *OptimizeIntToFloatBitCast(BitCastInst &CI,InstCombiner &IC){
|
||||
}
|
||||
|
||||
unsigned Elt = ShAmt->getZExtValue() / DestWidth;
|
||||
if (IC.getDataLayout()->isBigEndian())
|
||||
Elt = VecTy->getPrimitiveSizeInBits() / DestWidth - 1 - Elt;
|
||||
return ExtractElementInst::Create(VecInput, IC.Builder->getInt32(Elt));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user