mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +00:00
InstCombine: Improve the result bitvect type when folding (cmp pred (load (gep GV, i)) C) to a bit test.
The original code used i32, and i64 if legal. This introduced unneeded casts when they aren't legal, or when the index variable i has another type. In order of preference: try to use i's type; use the smallest fitting legal type (using an added DataLayout method); default to i32. A testcase checks that this works when the index gep operand is i16. Patch by : Ahmed Bougacha <ahmed.bougacha@gmail.com> Reviewed by : Duncan git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177712 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -443,20 +443,29 @@ FoldCmpLoadFromIndexedGlobal(GetElementPtrInst *GEP, GlobalVariable *GV,
|
||||
}
|
||||
|
||||
|
||||
// If a 32-bit or 64-bit magic bitvector captures the entire comparison state
|
||||
// If a magic bitvector captures the entire comparison state
|
||||
// of this load, replace it with computation that does:
|
||||
// ((magic_cst >> i) & 1) != 0
|
||||
if (ArrayElementCount <= 32 ||
|
||||
(TD && ArrayElementCount <= 64 && TD->isLegalInteger(64))) {
|
||||
Type *Ty;
|
||||
if (ArrayElementCount <= 32)
|
||||
{
|
||||
Type *Ty = 0;
|
||||
|
||||
// Look for an appropriate type:
|
||||
// - The type of Idx if the magic fits
|
||||
// - The smallest fitting legal type if we have a DataLayout
|
||||
// - Default to i32
|
||||
if (ArrayElementCount <= Idx->getType()->getIntegerBitWidth())
|
||||
Ty = Idx->getType();
|
||||
else if (TD)
|
||||
Ty = TD->getSmallestLegalIntType(Init->getContext(), ArrayElementCount);
|
||||
else if (ArrayElementCount <= 32)
|
||||
Ty = Type::getInt32Ty(Init->getContext());
|
||||
else
|
||||
Ty = Type::getInt64Ty(Init->getContext());
|
||||
Value *V = Builder->CreateIntCast(Idx, Ty, false);
|
||||
V = Builder->CreateLShr(ConstantInt::get(Ty, MagicBitvector), V);
|
||||
V = Builder->CreateAnd(ConstantInt::get(Ty, 1), V);
|
||||
return new ICmpInst(ICmpInst::ICMP_NE, V, ConstantInt::get(Ty, 0));
|
||||
|
||||
if (Ty != 0) {
|
||||
Value *V = Builder->CreateIntCast(Idx, Ty, false);
|
||||
V = Builder->CreateLShr(ConstantInt::get(Ty, MagicBitvector), V);
|
||||
V = Builder->CreateAnd(ConstantInt::get(Ty, 1), V);
|
||||
return new ICmpInst(ICmpInst::ICMP_NE, V, ConstantInt::get(Ty, 0));
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user