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

Duncan Sands baldrick at free.fr
Sun Jan 31 07:11:33 PST 2010


Author: baldrick
Date: Sun Jan 31 09:11:33 2010
New Revision: 94960

URL: http://llvm.org/viewvc/llvm-project?rev=94960&view=rev
Log:
Remove PLUS_EXPR and MINUS_EXPR logic from EmitReg_BinOp and handle them directly.
Most of the funky EmitReg_BinOp logic is not needed with modern versions of gcc,
and just gets in the way of seeing what's going on.  While there, use NSW when
appropriate for complex integers.

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=94960&r1=94959&r2=94960&view=diff

==============================================================================
--- dragonegg/trunk/llvm-convert.cpp (original)
+++ dragonegg/trunk/llvm-convert.cpp Sun Jan 31 09:11:33 2010
@@ -5057,24 +5057,6 @@
   Value *DSTr, *DSTi;
   switch (code) {
   default: llvm_unreachable("Unhandled complex binop!");
-  case PLUS_EXPR: // (a+ib) + (c+id) = (a+c) + i(b+d)
-    if (LHSr->getType()->isFloatingPoint()) {
-      DSTr = Builder.CreateFAdd(LHSr, RHSr);
-      DSTi = Builder.CreateFAdd(LHSi, RHSi);
-    } else {
-      DSTr = Builder.CreateAdd(LHSr, RHSr);
-      DSTi = Builder.CreateAdd(LHSi, RHSi);
-    }
-    break;
-  case MINUS_EXPR: // (a+ib) - (c+id) = (a-c) + i(b-d)
-    if (LHSr->getType()->isFloatingPoint()) {
-      DSTr = Builder.CreateFSub(LHSr, RHSr);
-      DSTi = Builder.CreateFSub(LHSi, RHSi);
-    } else {
-      DSTr = Builder.CreateSub(LHSr, RHSr);
-      DSTi = Builder.CreateSub(LHSi, RHSi);
-    }
-    break;
   case MULT_EXPR: { // (a+ib) * (c+id) = (ac-bd) + i(ad+cb)
     if (LHSr->getType()->isFloatingPoint()) {
       Value *Tmp1 = Builder.CreateFMul(LHSr, RHSr); // a*c
@@ -6131,10 +6113,6 @@
   Value *V;
   if (Opc == Instruction::SDiv && IsExactDiv)
     V = Builder.CreateExactSDiv(LHS, RHS);
-  else if (Opc == Instruction::Add && !TYPE_OVERFLOW_WRAPS(type))
-    V = Builder.CreateNSWAdd(LHS, RHS);
-  else if (Opc == Instruction::Sub && !TYPE_OVERFLOW_WRAPS(type))
-    V = Builder.CreateNSWSub(LHS, RHS);
   else if (Opc == Instruction::Mul && !TYPE_OVERFLOW_WRAPS(type))
     V = Builder.CreateNSWMul(LHS, RHS);
   else
@@ -6375,6 +6353,72 @@
   return Builder.CreateSelect(SameAsRem, Rem, RemPlusRHS, "mod");
 }
 
+Value *TreeToLLVM::EmitReg_MINUS_EXPR(tree op0, tree op1) {
+  Value *LHS = EmitRegister(op0);
+  Value *RHS = EmitRegister(op1);
+  tree type = TREE_TYPE(op0);
+
+  if (TREE_CODE(type) == COMPLEX_TYPE) {
+    tree elt_type = TREE_TYPE(type);
+    Value *LHSr, *LHSi; SplitComplex(LHS, LHSr, LHSi, elt_type);
+    Value *RHSr, *RHSi; SplitComplex(RHS, RHSr, RHSi, elt_type);
+
+    // (a+ib) - (c+id) = (a-c) + i(b-d)
+    if (LHSr->getType()->isFloatingPoint()) {
+      LHSr = Builder.CreateFSub(LHSr, RHSr);
+      LHSi = Builder.CreateFSub(LHSi, RHSi);
+    } else if (TYPE_OVERFLOW_WRAPS(elt_type)) {
+      LHSr = Builder.CreateSub(LHSr, RHSr);
+      LHSi = Builder.CreateSub(LHSi, RHSi);
+    } else {
+      LHSr = Builder.CreateNSWSub(LHSr, RHSr);
+      LHSi = Builder.CreateNSWSub(LHSi, RHSi);
+    }
+
+    return CreateComplex(LHSr, LHSi, elt_type);
+  }
+
+  if (LHS->getType()->isFPOrFPVector())
+    return Builder.CreateFSub(LHS, RHS);
+  else if (TYPE_OVERFLOW_WRAPS(type))
+    return Builder.CreateSub(LHS, RHS);
+  else
+    return Builder.CreateNSWSub(LHS, RHS);
+}
+
+Value *TreeToLLVM::EmitReg_PLUS_EXPR(tree op0, tree op1) {
+  Value *LHS = EmitRegister(op0);
+  Value *RHS = EmitRegister(op1);
+  tree type = TREE_TYPE(op0);
+
+  if (TREE_CODE(type) == COMPLEX_TYPE) {
+    tree elt_type = TREE_TYPE(type);
+    Value *LHSr, *LHSi; SplitComplex(LHS, LHSr, LHSi, elt_type);
+    Value *RHSr, *RHSi; SplitComplex(RHS, RHSr, RHSi, elt_type);
+
+    // (a+ib) + (c+id) = (a+c) + i(b+d)
+    if (LHSr->getType()->isFloatingPoint()) {
+      LHSr = Builder.CreateFAdd(LHSr, RHSr);
+      LHSi = Builder.CreateFAdd(LHSi, RHSi);
+    } else if (TYPE_OVERFLOW_WRAPS(elt_type)) {
+      LHSr = Builder.CreateAdd(LHSr, RHSr);
+      LHSi = Builder.CreateAdd(LHSi, RHSi);
+    } else {
+      LHSr = Builder.CreateNSWAdd(LHSr, RHSr);
+      LHSi = Builder.CreateNSWAdd(LHSi, RHSi);
+    }
+
+    return CreateComplex(LHSr, LHSi, elt_type);
+  }
+
+  if (LHS->getType()->isFPOrFPVector())
+    return Builder.CreateFAdd(LHS, RHS);
+  else if (TYPE_OVERFLOW_WRAPS(type))
+    return Builder.CreateAdd(LHS, RHS);
+  else
+    return Builder.CreateNSWAdd(LHS, RHS);
+}
+
 Value *TreeToLLVM::EmitReg_POINTER_PLUS_EXPR(tree type, tree op0, tree op1) {
   Value *Ptr = EmitRegister(op0); // The pointer.
   Value *Idx = EmitRegister(op1); // The offset in bytes.
@@ -7206,16 +7250,14 @@
                              ICmpInst::ICMP_SLE, FCmpInst::FCMP_OLE, false);
     break;
   case MINUS_EXPR:
-    RHS = EmitReg_BinOp(type, code, rhs1, rhs2, FLOAT_TYPE_P(type) ?
-                        Instruction::FSub : Instruction::Sub);
+    RHS = EmitReg_MINUS_EXPR(rhs1, rhs2);
     break;
   case MULT_EXPR:
     RHS = EmitReg_BinOp(type, code, rhs1, rhs2, FLOAT_TYPE_P(type) ?
                         Instruction::FMul : Instruction::Mul);
     break;
   case PLUS_EXPR:
-    RHS = EmitReg_BinOp(type, code, rhs1, rhs2, FLOAT_TYPE_P(type) ?
-                        Instruction::FAdd : Instruction::Add);
+    RHS = EmitReg_PLUS_EXPR(rhs1, rhs2);
     break;
   case POINTER_PLUS_EXPR:
     RHS = EmitReg_POINTER_PLUS_EXPR(type, rhs1, rhs2); break;

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

==============================================================================
--- dragonegg/trunk/llvm-internal.h (original)
+++ dragonegg/trunk/llvm-internal.h Sun Jan 31 09:11:33 2010
@@ -644,6 +644,8 @@
                                 tree_node *op1);
   Value *EmitReg_FLOOR_MOD_EXPR(tree_node *type, tree_node *op0,
                                 tree_node *op1);
+  Value *EmitReg_MINUS_EXPR(tree_node *op0, tree_node *op1);
+  Value *EmitReg_PLUS_EXPR(tree_node *op0, tree_node *op1);
   Value *EmitReg_POINTER_PLUS_EXPR(tree_node *type, tree_node *op0,
                                    tree_node *op1);
   Value *EmitReg_ROUND_DIV_EXPR(tree_node *type, tree_node *op0,





More information about the llvm-commits mailing list