Swap operands now preserves the semantics of the binary operator by changing
authorChris Lattner <sabre@nondot.org>
Thu, 13 Dec 2001 00:43:03 +0000 (00:43 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 13 Dec 2001 00:43:03 +0000 (00:43 +0000)
the opcode of the instruction if possible.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1444 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/InstrTypes.h
lib/VMCore/iOperators.cpp

index 54aab3287584c6f8f6212e471ac519f370586864..3d834e97a08fbfd36add32274c87fff319cba86a 100644 (file)
@@ -127,10 +127,14 @@ public:
 
   virtual const char *getOpcodeName() const = 0;
 
-  // swapOperands - Exchange the two operands to this instruction
-  void swapOperands() {
-    swap(Operands[0], Operands[1]);
-  }
+  // swapOperands - Exchange the two operands to this instruction.
+  // This instruction is safe to use on any binary instruction and
+  // does not modify the semantics of the instruction.  If the
+  // instruction is order dependant (SetLT f.e.) the opcode is
+  // changed.  If the instruction cannot be reversed (ie, it's a Div),
+  // then return true.
+  //
+  bool swapOperands();
 
   // Methods for support type inquiry through isa, cast, and dyn_cast:
   static inline bool classof(const BinaryOperator *) { return true; }
index 22b6052d4692dd5f484e22795387e0011bf5767b..cb53d5e0344d9718ee87b002db3443db904f576d 100644 (file)
@@ -53,6 +53,32 @@ BinaryOperator *BinaryOperator::create(BinaryOps Op, Value *S1, Value *S2,
   }
 }
 
+// swapOperands - Exchange the two operands to this instruction.  This
+// instruction is safe to use on any binary instruction and does not
+// modify the semantics of the instruction.  If the instruction is
+// order dependant (SetLT f.e.) the opcode is changed.
+//
+bool BinaryOperator::swapOperands() {
+  switch (getOpcode()) {
+    // Instructions that don't need opcode modification
+  case Add: case Mul:
+  case And: case Xor:
+  case Or:
+  case SetEQ: case SetNE:
+    break;
+    // Instructions that need opcode modification
+  case SetGT: iType = SetLT; break;
+  case SetLT: iType = SetGT; break;
+  case SetGE: iType = SetLE; break;
+  case SetLE: iType = SetGE; break;
+    // Error on the side of caution
+  default:
+    return true;
+  }
+  swap(Operands[0], Operands[1]);
+  return false;
+}
+
 
 //===----------------------------------------------------------------------===//
 //                            GenericBinaryInst Class