diff options
-rw-r--r-- | include/llvm/Support/IRBuilder.h | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/include/llvm/Support/IRBuilder.h b/include/llvm/Support/IRBuilder.h index d69a35edb1..95d9c5a060 100644 --- a/include/llvm/Support/IRBuilder.h +++ b/include/llvm/Support/IRBuilder.h @@ -573,29 +573,40 @@ public: return Insert(new GetResultInst(V, Index), Name); } - ExtractValueInst *CreateExtractValue(Value *Agg, unsigned Idx, - const char *Name = "") { + Value *CreateExtractValue(Value *Agg, unsigned Idx, + const char *Name = "") { + if (Constant *AggC = dyn_cast<Constant>(Agg)) + return ConstantExpr::getExtractValue(AggC, &Idx, 1); return Insert(ExtractValueInst::Create(Agg, Idx), Name); } template<typename InputIterator> - ExtractValueInst *CreateExtractValue(Value *Agg, - InputIterator IdxBegin, - InputIterator IdxEnd, - const char *Name = "") { + Value *CreateExtractValue(Value *Agg, + InputIterator IdxBegin, + InputIterator IdxEnd, + const char *Name = "") { + if (Constant *AggC = dyn_cast<Constant>(Agg)) + return ConstantExpr::getExtractValue(AggC, IdxBegin, IdxEnd - IdxBegin); return Insert(ExtractValueInst::Create(Agg, IdxBegin, IdxEnd), Name); } - InsertValueInst *CreateInsertValue(Value *Agg, Value *Val, unsigned Idx, - const char *Name = "") { + Value *CreateInsertValue(Value *Agg, Value *Val, unsigned Idx, + const char *Name = "") { + if (Constant *AggC = dyn_cast<Constant>(Agg)) + if (Constant *ValC = dyn_cast<Constant>(Val)) + return ConstantExpr::getInsertValue(AggC, ValC, &Idx, 1); return Insert(InsertValueInst::Create(Agg, Val, Idx), Name); } template<typename InputIterator> - InsertValueInst *CreateInsertValue(Value *Agg, Value *Val, - InputIterator IdxBegin, - InputIterator IdxEnd, - const char *Name = "") { + Value *CreateInsertValue(Value *Agg, Value *Val, + InputIterator IdxBegin, + InputIterator IdxEnd, + const char *Name = "") { + if (Constant *AggC = dyn_cast<Constant>(Agg)) + if (Constant *ValC = dyn_cast<Constant>(Val)) + return ConstantExpr::getInsertValue(AggC, ValC, + IdxBegin, IdxEnd - IdxBegin); return Insert(InsertValueInst::Create(Agg, Val, IdxBegin, IdxEnd), Name); } }; |