[llvm-commits] [dragonegg] r95080 - in /dragonegg/trunk: llvm-convert.cpp llvm-internal.h

Duncan Sands baldrick at free.fr
Tue Feb 2 02:33:07 PST 2010


Author: baldrick
Date: Tue Feb  2 04:33:07 2010
New Revision: 95080

URL: http://llvm.org/viewvc/llvm-project?rev=95080&view=rev
Log:
More deBinOpfuscation: handle TRUNC_MOD_EXPR directly.

Modified:
    dragonegg/trunk/llvm-convert.cpp
    dragonegg/trunk/llvm-internal.h

Modified: dragonegg/trunk/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=95080&r1=95079&r2=95080&view=diff

==============================================================================
--- dragonegg/trunk/llvm-convert.cpp (original)
+++ dragonegg/trunk/llvm-convert.cpp Tue Feb  2 04:33:07 2010
@@ -6304,20 +6304,20 @@
 Value *TreeToLLVM::EmitReg_FLOOR_MOD_EXPR(tree type, tree op0, tree op1) {
   // Notation: FLOOR_MOD_EXPR <-> Mod, TRUNC_MOD_EXPR <-> Rem.
 
+  Value *LHS = EmitRegister(op0);
+  Value *RHS = EmitRegister(op1);
+
   // We express Mod in terms of Rem as follows: if RHS exactly divides LHS,
   // or the values of LHS and RHS have the same sign, then Mod equals Rem.
   // Otherwise Mod equals Rem + RHS.  This means that LHS Mod RHS traps iff
   // LHS Rem RHS traps.
   if (TYPE_UNSIGNED(type))
     // LHS and RHS values must have the same sign if their type is unsigned.
-    return EmitReg_BinOp(type, FLOOR_MOD_EXPR, op0, op1, Instruction::URem);
+    return Builder.CreateURem(LHS, RHS);
 
   const Type *Ty = GetRegType(type);
   Constant *Zero = ConstantInt::get(Ty, 0);
 
-  Value *LHS = EmitRegister(op0);
-  Value *RHS = EmitRegister(op1);
-
   // The two possible values for Mod.
   Value *Rem = Builder.CreateSRem(LHS, RHS, "rem");
   Value *RemPlusRHS = Builder.CreateAdd(Rem, RHS);
@@ -6596,6 +6596,13 @@
   }
 }
 
+Value *TreeToLLVM::EmitReg_TRUNC_MOD_EXPR(tree op0, tree op1) {
+  Value *LHS = EmitRegister(op0);
+  Value *RHS = EmitRegister(op1);
+  return TYPE_UNSIGNED(TREE_TYPE(op0)) ?
+    Builder.CreateURem(LHS, RHS) : Builder.CreateSRem(LHS, RHS);
+}
+
 
 //===----------------------------------------------------------------------===//
 //                        ... Exception Handling ...
@@ -7349,9 +7356,7 @@
   case TRUNC_DIV_EXPR:
     RHS = EmitReg_TRUNC_DIV_EXPR(rhs1, rhs2, /*isExact*/false); break;
   case TRUNC_MOD_EXPR:
-    RHS = EmitReg_BinOp(type, code, rhs1, rhs2, TYPE_UNSIGNED(type) ?
-                        Instruction::URem : Instruction::SRem);
-    break;
+    RHS = EmitReg_TRUNC_MOD_EXPR(rhs1, rhs2); break;
   case TRUTH_AND_EXPR:
     RHS = EmitReg_TruthOp(type, rhs1, rhs2, Instruction::And); break;
   case TRUTH_OR_EXPR:

Modified: dragonegg/trunk/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-internal.h?rev=95080&r1=95079&r2=95080&view=diff

==============================================================================
--- dragonegg/trunk/llvm-internal.h (original)
+++ dragonegg/trunk/llvm-internal.h Tue Feb  2 04:33:07 2010
@@ -665,7 +665,7 @@
   Value *EmitReg_ROUND_DIV_EXPR(tree_node *type, tree_node *op0,
                                 tree_node *op1);
   Value *EmitReg_TRUNC_DIV_EXPR(tree_node *op0, tree_node *op1, bool isExact);
-
+  Value *EmitReg_TRUNC_MOD_EXPR(tree_node *op0, tree_node *op1);
 
   Value *EmitLoadOfLValue(tree_node *exp);
   Value *EmitOBJ_TYPE_REF(tree_node *exp);





More information about the llvm-commits mailing list