[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