On 12/30/06, Reid Spencer <[EMAIL PROTECTED]> wrote:
Rafael,

Nothing was attached to your message.
oops!

Rafael
Index: gcc/llvm-convert.cpp
===================================================================
--- gcc/llvm-convert.cpp	(revisão 236)
+++ gcc/llvm-convert.cpp	(cópia de trabalho)
@@ -544,23 +544,37 @@
   case TRUTH_NOT_EXPR: Result = EmitTRUTH_NOT_EXPR(exp); break;
 
   // Binary Operators
-  case LT_EXPR:        Result = EmitCompare(exp, Instruction::SetLT, 0); break;
-  case LE_EXPR:        Result = EmitCompare(exp, Instruction::SetLE, 0); break;
-  case GT_EXPR:        Result = EmitCompare(exp, Instruction::SetGT, 0); break;
-  case GE_EXPR:        Result = EmitCompare(exp, Instruction::SetGE, 0); break;
-  case EQ_EXPR:        Result = EmitCompare(exp, Instruction::SetEQ, 0); break;
-  case NE_EXPR:        Result = EmitCompare(exp, Instruction::SetNE, 0); break;
-  case UNORDERED_EXPR: Result = EmitCompare(exp, 0, 1); break; // not a typo
-  case ORDERED_EXPR:   Result = EmitCompare(exp, 0, 1); break; // not a typo
-  case UNLT_EXPR:      Result = EmitCompare(exp, Instruction::SetLT, 1); break;
-  case UNLE_EXPR:      Result = EmitCompare(exp, Instruction::SetLE, 1); break;
-  case UNGT_EXPR:      Result = EmitCompare(exp, Instruction::SetGT, 1); break;
-  case UNGE_EXPR:      Result = EmitCompare(exp, Instruction::SetGE, 1); break;
-  case UNEQ_EXPR:      Result = EmitCompare(exp, Instruction::SetEQ, 1); break;
-  case LTGT_EXPR:      Result = EmitCompare(exp, Instruction::SetNE, 1); break;
-  case PLUS_EXPR:      Result = EmitBinOp(exp, DestLoc, Instruction::Add);break;
-  case MINUS_EXPR:     Result = EmitBinOp(exp, DestLoc, Instruction::Sub);break;
-  case MULT_EXPR:      Result = EmitBinOp(exp, DestLoc, Instruction::Mul);break;
+  case LT_EXPR: 
+    Result = EmitCompare(exp, ICmpInst::ICMP_ULT, ICmpInst::ICMP_SLT, 
+                         FCmpInst::FCMP_OLT); break;
+  case LE_EXPR:
+    Result = EmitCompare(exp, ICmpInst::ICMP_ULE, ICmpInst::ICMP_SLE,
+                         FCmpInst::FCMP_OLE); break;
+  case GT_EXPR:
+    Result = EmitCompare(exp, ICmpInst::ICMP_UGT, ICmpInst::ICMP_SGT,
+                         FCmpInst::FCMP_OGT); break;
+  case GE_EXPR:
+    Result = EmitCompare(exp, ICmpInst::ICMP_UGE, ICmpInst::ICMP_SGE, 
+                         FCmpInst::FCMP_OGE); break;
+  case EQ_EXPR:
+    Result = EmitCompare(exp, ICmpInst::ICMP_EQ, ICmpInst::ICMP_EQ, 
+                         FCmpInst::FCMP_OEQ); break;
+  case NE_EXPR:
+    Result = EmitCompare(exp, ICmpInst::ICMP_NE, ICmpInst::ICMP_NE, 
+                         FCmpInst::FCMP_UNE); break;
+  case UNORDERED_EXPR: 
+    Result = EmitCompare(exp, 0, 0, FCmpInst::FCMP_UNO); break;
+  case ORDERED_EXPR: 
+    Result = EmitCompare(exp, 0, 0, FCmpInst::FCMP_ORD); break;
+  case UNLT_EXPR: Result = EmitCompare(exp, 0, 0, FCmpInst::FCMP_ULT); break;
+  case UNLE_EXPR: Result = EmitCompare(exp, 0, 0, FCmpInst::FCMP_ULE); break;
+  case UNGT_EXPR: Result = EmitCompare(exp, 0, 0, FCmpInst::FCMP_UGT); break;
+  case UNGE_EXPR: Result = EmitCompare(exp, 0, 0, FCmpInst::FCMP_UGE); break;
+  case UNEQ_EXPR: Result = EmitCompare(exp, 0, 0, FCmpInst::FCMP_UEQ); break;
+  case LTGT_EXPR: Result = EmitCompare(exp, 0, 0, FCmpInst::FCMP_UNE); break;
+  case PLUS_EXPR: Result = EmitBinOp(exp, DestLoc, Instruction::Add);break;
+  case MINUS_EXPR:Result = EmitBinOp(exp, DestLoc, Instruction::Sub);break;
+  case MULT_EXPR: Result = EmitBinOp(exp, DestLoc, Instruction::Mul);break;
   case TRUNC_DIV_EXPR: 
     if (TYPE_UNSIGNED(TREE_TYPE(exp)))
       Result = EmitBinOp(exp, DestLoc, Instruction::UDiv);
@@ -596,8 +610,14 @@
   case LROTATE_EXPR:
     Result = EmitRotateOp(exp, Instruction::Shl, Instruction::LShr);
     break;
-  case MIN_EXPR:       Result = EmitMinMaxExpr(exp, Instruction::SetLE); break;
-  case MAX_EXPR:       Result = EmitMinMaxExpr(exp, Instruction::SetGE); break;
+  case MIN_EXPR: 
+    Result = EmitMinMaxExpr(exp, ICmpInst::ICMP_ULE, ICmpInst::ICMP_SLE, 
+                            FCmpInst::FCMP_OLE);
+    break;
+  case MAX_EXPR:
+    Result = EmitMinMaxExpr(exp, ICmpInst::ICMP_UGE, ICmpInst::ICMP_SGE,
+                            FCmpInst::FCMP_OGE);
+    break;
   case CONSTRUCTOR:    Result = EmitCONSTRUCTOR(exp, DestLoc); break;
     
   // Complex Math Expressions.
@@ -1353,8 +1373,8 @@
   Value *Cond = Emit(COND_EXPR_COND(exp), 0);
   // If its not already a bool, insert a comparison against zero to make it so.
   if (Cond->getType() != Type::BoolTy)
-    Cond = new SetCondInst(Instruction::SetNE, Cond, 
-                           Constant::getNullValue(Cond->getType()), "toBool", 
+    Cond = new ICmpInst(ICmpInst::ICMP_NE, Cond, 
+                        Constant::getNullValue(Cond->getType()), "toBool", 
                            CurBB);
   tree Then = COND_EXPR_THEN(exp);
   tree Else = COND_EXPR_ELSE(exp);
@@ -2323,8 +2343,9 @@
   Value *Op = Emit(TREE_OPERAND(exp, 0), 0);
   if (!Op->getType()->isFloatingPoint()) {
     Instruction *OpN = BinaryOperator::createNeg(Op, Op->getName()+"neg",CurBB);
-    Value *Cmp = new SetCondInst(Instruction::SetGE, Op, OpN->getOperand(0),
-                                 "abscond", CurBB);
+    ICmpInst::Predicate pred = TYPE_UNSIGNED(TREE_TYPE(TREE_OPERAND(exp,0))) ?
+      ICmpInst::ICMP_UGE : ICmpInst::ICMP_SGE;
+    Value *Cmp = new ICmpInst(pred, Op, OpN->getOperand(0), "abscond", CurBB);
     return new SelectInst(Cmp, Op, OpN, "abs", CurBB);
   } else {
     // Turn FP abs into fabs/fabsf.
@@ -2341,8 +2362,8 @@
 Value *TreeToLLVM::EmitTRUTH_NOT_EXPR(tree exp) {
   Value *V = Emit(TREE_OPERAND(exp, 0), 0);
   if (V->getType() != Type::BoolTy) 
-    V = new SetCondInst(Instruction::SetNE, V, 
-                        Constant::getNullValue(V->getType()), "toBool", CurBB);
+    V = new ICmpInst(ICmpInst::ICMP_NE, V, 
+                     Constant::getNullValue(V->getType()), "toBool", CurBB);
   V = BinaryOperator::createNot(V, V->getName()+"not", CurBB);
   return CastToUIntType(V, ConvertType(TREE_TYPE(exp)));
 }
@@ -2351,45 +2372,41 @@
 /// comparison to use.  isUnord is true if this is a floating point comparison
 /// that should also be true if either operand is a NaN.  Note that Opc can be
 /// set to zero for special cases.
-Value *TreeToLLVM::EmitCompare(tree exp, unsigned Opc, bool isUnord) {
-  if (TREE_CODE(TREE_TYPE(TREE_OPERAND(exp, 0))) == COMPLEX_TYPE)
+Value *TreeToLLVM::EmitCompare(tree exp, unsigned UIOpc, unsigned SIOpc, 
+                               unsigned FPPred) {
+  // Get the type of the operands
+  tree Op0Ty = TREE_TYPE(TREE_OPERAND(exp,0));
+
+  // Deal with complex types
+  if (TREE_CODE(Op0Ty) == COMPLEX_TYPE)
     return EmitComplexBinOp(exp, 0);  // Complex ==/!=
-  
-  // Comparison of struct is not allowed, so this is safe.
+
+  // Get the compare operands, in the right type. Comparison of struct is not
+  // allowed, so this is safe as we already handled complex (struct) type.
   Value *LHS = Emit(TREE_OPERAND(exp, 0), 0);
   Value *RHS = Emit(TREE_OPERAND(exp, 1), 0);
   bool LHSIsSigned = !TYPE_UNSIGNED(TREE_TYPE(TREE_OPERAND(exp, 0)));
   bool RHSIsSigned = !TYPE_UNSIGNED(TREE_TYPE(TREE_OPERAND(exp, 1)));
   RHS = CastToAnyType(RHS, RHSIsSigned, LHS->getType(), LHSIsSigned);
-  
   assert(LHS->getType() == RHS->getType() && "Binop type equality failure!");
-  
-  Value *Result = 0;
-  if (Opc)
-    Result = new SetCondInst((Instruction::BinaryOps)Opc, LHS, RHS, "tmp",
-                             CurBB);
-  
-  if (isUnord) {
-    static Function *IsUnordF = 0, *IsUnordD = 0;
-    Function *&Callee = LHS->getType() == Type::FloatTy ? IsUnordF : IsUnordD;
-    const char *Name  = LHS->getType() == Type::FloatTy ?
-                         "llvm.isunordered.f32" : "llvm.isunordered.f64";
+
+  // Handle the integer/pointer cases
+  if (!FLOAT_TYPE_P(Op0Ty)) {
+    // Determine which predicate to use based on signedness
+    ICmpInst::Predicate pred = 
+      ICmpInst::Predicate(TYPE_UNSIGNED(Op0Ty) ? UIOpc : SIOpc);
+
+    // Get the compare instructions
+    Value *Result = new ICmpInst(pred, LHS, RHS, "tmp", CurBB);
     
-    if (Callee == 0)
-      Callee = TheModule->getOrInsertFunction(Name,
-                                              Type::BoolTy, LHS->getType(),
-                                              LHS->getType(), NULL);
-    
-    Value *IsUnord = new CallInst(Callee, LHS, RHS, "tmp", CurBB);
-    if (Result)
-      Result = BinaryOperator::createOr(Result, IsUnord, "tmp", CurBB);
-    else
-      Result = IsUnord;
-    
-    // If this is an ORDERED_EXPR, invert the result of the isunordered call.
-    if (TREE_CODE(exp) == ORDERED_EXPR)
-      Result = BinaryOperator::createNot(Result, "tmp", CurBB);
+    // The GCC type is probably an int, not a bool.
+    return CastToUIntType(Result, ConvertType(TREE_TYPE(exp)));
   }
+
+  // Handle floating point comparisons, if we get here.
+  Value *Result = 0;
+  if (FPPred)
+    Result = new FCmpInst(FCmpInst::Predicate(FPPred), LHS, RHS, "tmp", CurBB);
   
   // The GCC type is probably an int, not a bool.
   return CastToUIntType(Result, ConvertType(TREE_TYPE(exp)));
@@ -2480,12 +2497,10 @@
   
   // This is a truth operation like the strict &&,||,^^.  Convert to bool as
   // a test against zero
-  LHS = new SetCondInst(Instruction::SetNE, LHS, 
-                        Constant::getNullValue(LHS->getType()),
-                        "toBool", CurBB);
-  RHS = new SetCondInst(Instruction::SetNE, RHS, 
-                        Constant::getNullValue(RHS->getType()),
-                        "toBool", CurBB);
+  LHS = new ICmpInst(ICmpInst::ICMP_NE, LHS, 
+                     Constant::getNullValue(LHS->getType()), "toBool", CurBB);
+  RHS = new ICmpInst(ICmpInst::ICMP_NE, RHS, 
+                     Constant::getNullValue(RHS->getType()), "toBool", CurBB);
   
   Value *Res = BinaryOperator::create((Instruction::BinaryOps)Opc, LHS, RHS,
                                       "tmp", CurBB);
@@ -2523,7 +2538,8 @@
   return CastToUIntType(Merge, ConvertType(TREE_TYPE(exp)));
 }
 
-Value *TreeToLLVM::EmitMinMaxExpr(tree exp, unsigned CmpOpc) {
+Value *TreeToLLVM::EmitMinMaxExpr(tree exp, unsigned UIPred, unsigned SIPred, 
+                                  unsigned FPPred) {
   Value *LHS = Emit(TREE_OPERAND(exp, 0), 0);
   Value *RHS = Emit(TREE_OPERAND(exp, 1), 0);
 
@@ -2541,9 +2557,15 @@
   opcode = CastInst::getCastOpcode(LHS, LHSIsSigned, Ty, TyIsSigned);
   RHS = CastToType(opcode, RHS, Ty);
   
-  Value *Pred = new SetCondInst((Instruction::BinaryOps)CmpOpc, LHS, RHS,
-                                "tmp", CurBB);
-  return new SelectInst(Pred, LHS, RHS,
+  Value *Compare;
+  if (LHS->getType()->isFloatingPoint())
+    Compare = new FCmpInst(FCmpInst::Predicate(FPPred), LHS, RHS, "tmp", CurBB);
+  else if TYPE_UNSIGNED(TREE_TYPE(TREE_OPERAND(exp, 0)))
+    Compare = new ICmpInst(ICmpInst::Predicate(UIPred), LHS, RHS, "tmp", CurBB);
+  else
+    Compare = new ICmpInst(ICmpInst::Predicate(SIPred), LHS, RHS, "tmp", CurBB);
+
+  return new SelectInst(Compare, LHS, RHS,
                         TREE_CODE(exp) == MAX_EXPR ? "max" : "min", CurBB);
 }
 
@@ -3226,9 +3248,14 @@
     Result = BinaryOperator::createAdd(Result, 
                                        ConstantInt::get(Type::IntTy, 1),
                                        "tmp", CurBB);
-    Value *Cond = BinaryOperator::createSetEQ(Amt, 
-                                        Constant::getNullValue(Amt->getType()),
-                                              "tmp", CurBB);
+    Value *Cond;
+    if (Amt->getType()->isFloatingPoint())
+      Cond = new FCmpInst(FCmpInst::FCMP_OEQ, Amt,
+                          Constant::getNullValue(Amt->getType()), "tmp", CurBB);
+    else 
+      Cond = new ICmpInst(ICmpInst::ICMP_EQ, Amt, 
+                          Constant::getNullValue(Amt->getType()), "tmp", CurBB);
+
     Result = new SelectInst(Cond, Constant::getNullValue(Type::IntTy),
                             Result, "tmp", CurBB);
     return true;
@@ -3777,12 +3804,12 @@
     break;
   }
   case EQ_EXPR:   // (a+ib) == (c+id) = (a == c) & (b == d)
-    DSTr = BinaryOperator::createSetEQ(LHSr, RHSr, "tmpr", CurBB);
-    DSTi = BinaryOperator::createSetEQ(LHSi, RHSi, "tmpi", CurBB);
+    DSTr = new FCmpInst(FCmpInst::FCMP_OEQ, LHSr, RHSr, "tmpr", CurBB);
+    DSTi = new FCmpInst(FCmpInst::FCMP_OEQ, LHSi, RHSi, "tmpi", CurBB);
     return BinaryOperator::createAnd(DSTr, DSTi, "tmp", CurBB);
   case NE_EXPR:   // (a+ib) != (c+id) = (a != c) | (b != d) 
-    DSTr = BinaryOperator::createSetNE(LHSr, RHSr, "tmpr", CurBB);
-    DSTi = BinaryOperator::createSetNE(LHSi, RHSi, "tmpi", CurBB);
+    DSTr = new FCmpInst(FCmpInst::FCMP_ONE, LHSr, RHSr, "tmpr", CurBB);
+    DSTi = new FCmpInst(FCmpInst::FCMP_ONE, LHSi, RHSi, "tmpi", CurBB);
     return BinaryOperator::createOr(DSTr, DSTi, "tmp", CurBB);
   }
   
Index: gcc/llvm-internal.h
===================================================================
--- gcc/llvm-internal.h	(revisão 236)
+++ gcc/llvm-internal.h	(cópia de trabalho)
@@ -398,13 +398,15 @@
   Value *EmitABS_EXPR(tree_node *exp);
   Value *EmitBIT_NOT_EXPR(tree_node *exp);
   Value *EmitTRUTH_NOT_EXPR(tree_node *exp);
-  Value *EmitCompare(tree_node *exp, unsigned Opc, bool isUnordered);
+  Value *EmitCompare(tree_node *exp, unsigned UIPred, unsigned SIPred, 
+                     unsigned FPOpc);
   Value *EmitBinOp(tree_node *exp, Value *DestLoc, unsigned Opc);
   Value *EmitPtrBinOp(tree_node *exp, unsigned Opc);
   Value *EmitTruthOp(tree_node *exp, unsigned Opc);
   Value *EmitShiftOp(tree_node *exp, Value *DestLoc, unsigned Opc);
   Value *EmitRotateOp(tree_node *exp, unsigned Opc1, unsigned Opc2);
-  Value *EmitMinMaxExpr(tree_node *exp, unsigned Opc);
+  Value *EmitMinMaxExpr(tree_node *exp, unsigned UIPred, unsigned SIPred, 
+                        unsigned Opc);
 
   // Inline Assembly and Register Variables.
   Value *EmitASM_EXPR(tree_node *exp);
_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to