[llvm-commits] [dragonegg] r130496 - in /dragonegg/trunk: include/dragonegg/Internals.h src/Convert.cpp

Duncan Sands baldrick at free.fr
Fri Apr 29 04:59:53 PDT 2011


Author: baldrick
Date: Fri Apr 29 06:59:53 2011
New Revision: 130496

URL: http://llvm.org/viewvc/llvm-project?rev=130496&view=rev
Log:
Add support for COND_EXPRs.  These are removed by the gimplifier but may
be reintroduced by the if-conversion pass when GCC optimization is enabled.
Note that unlike in llvm-gcc the operands are not branches but expressions.

Modified:
    dragonegg/trunk/include/dragonegg/Internals.h
    dragonegg/trunk/src/Convert.cpp

Modified: dragonegg/trunk/include/dragonegg/Internals.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/include/dragonegg/Internals.h?rev=130496&r1=130495&r2=130496&view=diff
==============================================================================
--- dragonegg/trunk/include/dragonegg/Internals.h (original)
+++ dragonegg/trunk/include/dragonegg/Internals.h Fri Apr 29 06:59:53 2011
@@ -721,6 +721,7 @@
   Value *EmitLoadOfLValue(tree_node *exp);
   Value *EmitOBJ_TYPE_REF(tree_node *exp);
   Value *EmitADDR_EXPR(tree_node *exp);
+  Value *EmitCOND_EXPR(tree_node *exp);
   Value *EmitCallOf(Value *Callee, gimple_statement_d *stmt,
                     const MemRef *DestLoc, const AttrListPtr &PAL);
   CallInst *EmitSimpleCall(StringRef CalleeName, tree_node *ret_type,

Modified: dragonegg/trunk/src/Convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/Convert.cpp?rev=130496&r1=130495&r2=130496&view=diff
==============================================================================
--- dragonegg/trunk/src/Convert.cpp (original)
+++ dragonegg/trunk/src/Convert.cpp Fri Apr 29 06:59:53 2011
@@ -2386,6 +2386,21 @@
   return Builder.CreateBitCast(LV.Ptr, ConvertType(TREE_TYPE(exp)));
 }
 
+Value *TreeToLLVM::EmitCOND_EXPR(tree exp) {
+  // Emit the comparison.
+  tree cond = COND_EXPR_COND(exp);
+  assert(COMPARISON_CLASS_P(cond) && "Expected a comparison!");
+  Value *CondVal = EmitCompare(TREE_OPERAND(cond, 0), TREE_OPERAND(cond, 1),
+                               TREE_CODE(cond));
+
+  // Emit the true and false values.
+  Value *TrueVal = EmitRegister(COND_EXPR_THEN(exp));
+  Value *FalseVal = EmitRegister(COND_EXPR_ELSE(exp));
+
+  // Select the value to use based on the condition.
+  return Builder.CreateSelect(CondVal, TrueVal, FalseVal);
+}
+
 Value *TreeToLLVM::EmitOBJ_TYPE_REF(tree exp) {
   return Builder.CreateBitCast(EmitRegister(OBJ_TYPE_REF_EXPR(exp)),
                                ConvertType(TREE_TYPE(exp)));
@@ -7897,6 +7912,7 @@
 
   // Expressions (tcc_expression).
   case ADDR_EXPR:    return EmitADDR_EXPR(rhs);
+  case COND_EXPR:    return EmitCOND_EXPR(rhs);
   case OBJ_TYPE_REF: return EmitOBJ_TYPE_REF(rhs);
 
   // Exceptional (tcc_exceptional).





More information about the llvm-commits mailing list