I love non-deturminism. Returning objects with references to stack objects is a...
authorAndrew Lenharth <andrewl@lenharth.org>
Tue, 13 Feb 2007 00:37:50 +0000 (00:37 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Tue, 13 Feb 2007 00:37:50 +0000 (00:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34210 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/PatternMatch.h

index 3cf037fa05714dc9fb7629f51b4d5b31bfc6ffee..ab9e45f312c0bc9700a820208345c2d0a16cef8c 100644 (file)
@@ -223,19 +223,22 @@ inline Shr_match<LHS, RHS> m_Shr(const LHS &L, const RHS &R) {
 
 template<typename LHS_t, typename RHS_t, typename Class, typename OpcType>
 struct BinaryOpClass_match {
-  OpcType &Opcode;
+  OpcType *Opcode;
   LHS_t L;
   RHS_t R;
 
   BinaryOpClass_match(OpcType &Op, const LHS_t &LHS,
                       const RHS_t &RHS)
-    : Opcode(Op), L(LHS), R(RHS) {}
+    : Opcode(&Op), L(LHS), R(RHS) {}
+  BinaryOpClass_match(const LHS_t &LHS, const RHS_t &RHS)
+    : Opcode(0), L(LHS), R(RHS) {}
 
   template<typename OpTy>
   bool match(OpTy *V) {
     if (Class *I = dyn_cast<Class>(V))
       if (L.match(I->getOperand(0)) && R.match(I->getOperand(1))) {
-        Opcode = I->getOpcode();
+        if (Opcode)
+          *Opcode = I->getOpcode();
         return true;
       }
 #if 0  // Doesn't handle constantexprs yet!
@@ -257,9 +260,8 @@ m_Shift(Instruction::BinaryOps &Op, const LHS &L, const RHS &R) {
 template<typename LHS, typename RHS>
 inline BinaryOpClass_match<LHS, RHS, BinaryOperator, Instruction::BinaryOps>
 m_Shift(const LHS &L, const RHS &R) {
-  Instruction::BinaryOps Op; 
   return BinaryOpClass_match<LHS, RHS, 
-                             BinaryOperator, Instruction::BinaryOps>(Op, L, R);
+                             BinaryOperator, Instruction::BinaryOps>(L, R);
 }
 
 //===----------------------------------------------------------------------===//