]> granicus.if.org Git - clang/commitdiff
fix rdar://6586493, a bug in codegen of the GNU
authorChris Lattner <sabre@nondot.org>
Fri, 13 Feb 2009 23:35:32 +0000 (23:35 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 13 Feb 2009 23:35:32 +0000 (23:35 +0000)
missing-?:-true-value extension.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64505 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprScalar.cpp
test/CodeGen/conditional-gnu-ext.c

index 962c2ebaccbdf37f2bc9fa900ca7b71f44121378..164d57eb715de7534e53c74941b47afb99e92f31 100644 (file)
@@ -1270,20 +1270,30 @@ VisitConditionalOperator(const ConditionalOperator *E) {
   llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end");
   Value *CondVal = 0;
 
-  // If we have the GNU missing condition extension, evaluate the conditional
-  // and then convert it to bool the hard way.  We do this explicitly
-  // because we need the unconverted value for the missing middle value of
-  // the ?:.
-  if (E->getLHS() == 0) {
+  // If we don't have the GNU missing condition extension, emit a branch on
+  // bool the normal way.
+  if (E->getLHS()) {
+    // Otherwise, just use EmitBranchOnBoolExpr to get small and simple code for
+    // the branch on bool.
+    CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock);
+  } else {
+    // Otherwise, for the ?: extension, evaluate the conditional and then
+    // convert it to bool the hard way.  We do this explicitly because we need
+    // the unconverted value for the missing middle value of the ?:.
     CondVal = CGF.EmitScalarExpr(E->getCond());
+    
+    // In some cases, EmitScalarConversion will delete the "CondVal" expression
+    // if there are no extra uses (an optimization).  Inhibit this by making an
+    // extra dead use, because we're going to add a use of CondVal later.  We
+    // don't use the builder for this, because we don't want it to get optimized
+    // away.  This leaves dead code, but the ?: extension isn't common.
+    new llvm::BitCastInst(CondVal, CondVal->getType(), "dummy?:holder",
+                          Builder.GetInsertBlock());
+    
     Value *CondBoolVal =
       CGF.EmitScalarConversion(CondVal, E->getCond()->getType(),
                                CGF.getContext().BoolTy);
     Builder.CreateCondBr(CondBoolVal, LHSBlock, RHSBlock);
-  } else {
-    // Otherwise, just use EmitBranchOnBoolExpr to get small and simple code for
-    // the branch on bool.
-    CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock);
   }
   
   CGF.EmitBlock(LHSBlock);
index d4ae330949fffa2985b62136523bbfe6229455fa..c3ff2bdccc5f974efae2b445cb31459494067e8a 100644 (file)
@@ -4,3 +4,9 @@
 int foo(int x, short y) {
   return x ?: y;
 }
+
+// rdar://6586493
+float test(float x, int Y) {
+  return Y != 0 ? : x;
+}
+