Implement codegen for __builtin_choose_expr. For example:
struct X { int A; };
void foo() {
struct X s;
int i;
i = __builtin_choose_expr(0, s, i);
}
compiles to:
%tmp = load i32* %i ; <i32> [#uses=1]
store i32 %tmp, i32* %i
wow :)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40801 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/CodeGen/CGExpr.cpp b/CodeGen/CGExpr.cpp
index 9697686..534376e 100644
--- a/CodeGen/CGExpr.cpp
+++ b/CodeGen/CGExpr.cpp
@@ -637,6 +637,8 @@
case Expr::ConditionalOperatorClass:
return EmitConditionalOperator(cast<ConditionalOperator>(E));
+ case Expr::ChooseExprClass:
+ return EmitChooseExpr(cast<ChooseExpr>(E));
}
}
@@ -658,6 +660,16 @@
E->typesAreCompatible()));
}
+/// EmitChooseExpr - Implement __builtin_choose_expr.
+RValue CodeGenFunction::EmitChooseExpr(const ChooseExpr *E) {
+ llvm::APSInt CondVal(32);
+ bool IsConst = E->getCond()->isIntegerConstantExpr(CondVal, getContext());
+ assert(IsConst && "Condition of choose expr must be i-c-e"); IsConst=IsConst;
+
+ // Emit the LHS or RHS as appropriate.
+ return EmitExpr(CondVal != 0 ? E->getLHS() : E->getRHS());
+}
+
RValue CodeGenFunction::EmitArraySubscriptExprRV(const ArraySubscriptExpr *E) {
// Emit subscript expressions in rvalue context's. For most cases, this just
diff --git a/CodeGen/CodeGenFunction.h b/CodeGen/CodeGenFunction.h
index 4c79498..0cc5f0d 100644
--- a/CodeGen/CodeGenFunction.h
+++ b/CodeGen/CodeGenFunction.h
@@ -58,6 +58,7 @@
class ArraySubscriptExpr;
class OCUVectorElementExpr;
class ConditionalOperator;
+ class ChooseExpr;
class PreDefinedExpr;
class BlockVarDecl;
@@ -399,6 +400,7 @@
// Conditional Operator.
RValue EmitConditionalOperator(const ConditionalOperator *E);
+ RValue EmitChooseExpr(const ChooseExpr *E);
};
} // end namespace CodeGen
} // end namespace clang