diff options
author | Chris Lattner <sabre@nondot.org> | 2007-08-11 23:49:01 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-08-11 23:49:01 +0000 |
commit | 001f7534e0311508cc93831a595785bb177f8a18 (patch) | |
tree | 4546f3841793c7151cbffb9c28ff1cde2a5a91dd /lib/Analysis/ConstantFolding.cpp | |
parent | 8d2e88806be0fbacb1fcba3f04ec57f16b417a11 (diff) | |
download | external_llvm-001f7534e0311508cc93831a595785bb177f8a18.zip external_llvm-001f7534e0311508cc93831a595785bb177f8a18.tar.gz external_llvm-001f7534e0311508cc93831a595785bb177f8a18.tar.bz2 |
constant fold ptrtoint(inttoptr) with target data when available. This allows
us to fold the entry block of PR1602 to false instead of:
br i1 icmp eq (i32 and (i32 ptrtoint (void (%struct.S*)* inttoptr (i64
1 to void (%struct.S*)*) to i32), i32 1), i32 0), label %cond_next, label
%cond_true
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41023 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/ConstantFolding.cpp')
-rw-r--r-- | lib/Analysis/ConstantFolding.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/lib/Analysis/ConstantFolding.cpp b/lib/Analysis/ConstantFolding.cpp index 9599a90..70ce349 100644 --- a/lib/Analysis/ConstantFolding.cpp +++ b/lib/Analysis/ConstantFolding.cpp @@ -217,6 +217,23 @@ Constant *llvm::ConstantFoldInstOperands(const Instruction* I, case Instruction::FCmp: return ConstantExpr::getCompare(cast<CmpInst>(I)->getPredicate(), Ops[0], Ops[1]); + case Instruction::PtrToInt: + // If the input is a inttoptr, eliminate the pair. This requires knowing + // the width of a pointer, so it can't be done in ConstantExpr::getCast. + if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ops[0])) { + if (TD && CE->getOpcode() == Instruction::IntToPtr) { + Constant *Input = CE->getOperand(0); + unsigned InWidth = Input->getType()->getPrimitiveSizeInBits(); + Constant *Mask = + ConstantInt::get(APInt::getLowBitsSet(InWidth, + TD->getPointerSizeInBits())); + Input = ConstantExpr::getAnd(Input, Mask); + // Do a zext or trunc to get to the dest size. + return ConstantExpr::getIntegerCast(Input, I->getType(), false); + } + } + // FALL THROUGH. + case Instruction::IntToPtr: case Instruction::Trunc: case Instruction::ZExt: case Instruction::SExt: @@ -226,8 +243,6 @@ Constant *llvm::ConstantFoldInstOperands(const Instruction* I, case Instruction::SIToFP: case Instruction::FPToUI: case Instruction::FPToSI: - case Instruction::PtrToInt: - case Instruction::IntToPtr: case Instruction::BitCast: return ConstantExpr::getCast(Opc, Ops[0], DestTy); case Instruction::Select: |