Add insertvalue and extractvalue folding support in IRBuilder.
authorDan Gohman <gohman@apple.com>
Tue, 22 Jul 2008 20:19:25 +0000 (20:19 +0000)
committerDan Gohman <gohman@apple.com>
Tue, 22 Jul 2008 20:19:25 +0000 (20:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53931 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/IRBuilder.h

index d69a35edb12d083bd59b7a88ae1b5e02c65b26a3..95d9c5a0600a740e3e814d5b6ee9d6c66070b31e 100644 (file)
@@ -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);
   }
 };