For PR1280:

When converting an add/xor/and triplet into a trunc/sext, only do so if the
intermediate integer type is a bitwidth that the targets can handle.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35400 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Reid Spencer 2007-03-28 01:36:16 +00:00
parent 7f49127935
commit 35c3885ba1

View File

@ -1940,11 +1940,21 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
CFF80Val = APIntOps::ashr(CFF80Val, Size);
} while (Size >= 1);
if (Size) {
const Type *MiddleType = IntegerType::get(Size);
// FIXME: This shouldn't be necessary. When the backends can handle types
// with funny bit widths then this whole cascade of if statements should
// be removed. It is just here to get the size of the "middle" type back
// up to something that the back ends can handle.
const Type *MiddleType = 0;
switch (Size) {
default: break;
case 32: MiddleType = Type::Int32Ty; break;
case 16: MiddleType = Type::Int16Ty; break;
case 8: MiddleType = Type::Int8Ty; break;
}
if (MiddleType) {
Instruction *NewTrunc = new TruncInst(XorLHS, MiddleType, "sext");
InsertNewInstBefore(NewTrunc, I);
return new SExtInst(NewTrunc, I.getType());
return new SExtInst(NewTrunc, I.getType(), I.getName());
}
}
}