[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