diff options
author | Frits van Bommel <fvbommel@gmail.com> | 2010-11-29 20:36:52 +0000 |
---|---|---|
committer | Frits van Bommel <fvbommel@gmail.com> | 2010-11-29 20:36:52 +0000 |
commit | a98214de10fd911aa5a8e3282f4ff90f25ec91cb (patch) | |
tree | 48ca7174ea70de7903841cadffacc1c26b15e9d5 /llvm/lib/Analysis/ConstantFolding.cpp | |
parent | 4921b1132005973b35660320f26add05953dae56 (diff) | |
download | bcm5719-llvm-a98214de10fd911aa5a8e3282f4ff90f25ec91cb.tar.gz bcm5719-llvm-a98214de10fd911aa5a8e3282f4ff90f25ec91cb.zip |
Teach ConstantFoldInstruction() how to fold insertvalue and extractvalue.
llvm-svn: 120316
Diffstat (limited to 'llvm/lib/Analysis/ConstantFolding.cpp')
-rw-r--r-- | llvm/lib/Analysis/ConstantFolding.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index a5804208c46..70ee9ddfa60 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -740,7 +740,18 @@ Constant *llvm::ConstantFoldInstruction(Instruction *I, const TargetData *TD) { if (const LoadInst *LI = dyn_cast<LoadInst>(I)) return ConstantFoldLoadInst(LI, TD); - + + if (InsertValueInst *IVI = dyn_cast<InsertValueInst>(I)) + return ConstantExpr::getInsertValue( + cast<Constant>(IVI->getAggregateOperand()), + cast<Constant>(IVI->getInsertedValueOperand()), + IVI->idx_begin(), IVI->getNumIndices()); + + if (ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(I)) + return ConstantExpr::getExtractValue( + cast<Constant>(EVI->getAggregateOperand()), + EVI->idx_begin(), EVI->getNumIndices()); + return ConstantFoldInstOperands(I->getOpcode(), I->getType(), Ops.data(), Ops.size(), TD); } |