diff options
author | Chris Lattner <sabre@nondot.org> | 2012-01-27 01:46:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2012-01-27 01:46:00 +0000 |
commit | 73858d16893e4cddd97f358a19b48bd4bc57ee97 (patch) | |
tree | ac1df403d31322009d901983496a7c6c9d01f4ac /lib/CodeGen | |
parent | f983da030e8295ae0f9a74d1185f999485f792b3 (diff) | |
download | external_llvm-73858d16893e4cddd97f358a19b48bd4bc57ee97.zip external_llvm-73858d16893e4cddd97f358a19b48bd4bc57ee97.tar.gz external_llvm-73858d16893e4cddd97f358a19b48bd4bc57ee97.tar.bz2 |
Rewrite CanShareConstantPoolEntry to be implemented in terms of the
mid-level constant folding APIs instead of doing its own analysis.
This makes it more general (e.g. can now share a <2 x i64> with a
<4 x i32>) and avoid duplicating a bunch of logic.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149111 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/MachineFunction.cpp | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/lib/CodeGen/MachineFunction.cpp b/lib/CodeGen/MachineFunction.cpp index a720467..0072a01 100644 --- a/lib/CodeGen/MachineFunction.cpp +++ b/lib/CodeGen/MachineFunction.cpp @@ -27,6 +27,7 @@ #include "llvm/CodeGen/Passes.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" +#include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/DebugInfo.h" #include "llvm/Support/Debug.h" #include "llvm/Target/TargetData.h" @@ -654,38 +655,37 @@ static bool CanShareConstantPoolEntry(const Constant *A, const Constant *B, // reject them. if (A->getType() == B->getType()) return false; + // We can't handle structs or arrays. + if (isa<StructType>(A->getType()) || isa<ArrayType>(A->getType()) || + isa<StructType>(B->getType()) || isa<ArrayType>(B->getType())) + return false; + // For now, only support constants with the same size. uint64_t StoreSize = TD->getTypeStoreSize(A->getType()); if (StoreSize != TD->getTypeStoreSize(B->getType()) || StoreSize > 128) return false; - - // If a floating-point value and an integer value have the same encoding, - // they can share a constant-pool entry. - if (const ConstantFP *AFP = dyn_cast<ConstantFP>(A)) - if (const ConstantInt *BI = dyn_cast<ConstantInt>(B)) - return AFP->getValueAPF().bitcastToAPInt() == BI->getValue(); - if (const ConstantFP *BFP = dyn_cast<ConstantFP>(B)) - if (const ConstantInt *AI = dyn_cast<ConstantInt>(A)) - return BFP->getValueAPF().bitcastToAPInt() == AI->getValue(); - - // Two vectors can share an entry if each pair of corresponding - // elements could. - if (const ConstantVector *AV = dyn_cast<ConstantVector>(A)) - if (const ConstantVector *BV = dyn_cast<ConstantVector>(B)) { - if (AV->getType()->getNumElements() != BV->getType()->getNumElements()) - return false; - for (unsigned i = 0, e = AV->getType()->getNumElements(); i != e; ++i) - if (!CanShareConstantPoolEntry(AV->getOperand(i), - BV->getOperand(i), TD)) - return false; - return true; - } - - // TODO: Handle other cases. - - return false; + Type *IntTy = IntegerType::get(A->getContext(), StoreSize*8); + + // Try constant folding a bitcast of both instructions to an integer. If we + // get two identical ConstantInt's, then we are good to share them. We use + // the constant folding APIs to do this so that we get the benefit of + // TargetData. + if (isa<PointerType>(A->getType())) + A = ConstantFoldInstOperands(Instruction::PtrToInt, IntTy, + const_cast<Constant*>(A), TD); + else if (A->getType() != IntTy) + A = ConstantFoldInstOperands(Instruction::BitCast, IntTy, + const_cast<Constant*>(A), TD); + if (isa<PointerType>(B->getType())) + B = ConstantFoldInstOperands(Instruction::PtrToInt, IntTy, + const_cast<Constant*>(B), TD); + else if (B->getType() != IntTy) + B = ConstantFoldInstOperands(Instruction::BitCast, IntTy, + const_cast<Constant*>(B), TD); + + return A == B; } /// getConstantPoolIndex - Create a new entry in the constant pool or return |