Try to not emit the dead side of ?: if the condition is a constant.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59061 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp
index 82f0cc7..bf22902 100644
--- a/lib/CodeGen/CGExprScalar.cpp
+++ b/lib/CodeGen/CGExprScalar.cpp
@@ -1110,14 +1110,31 @@
 
 Value *ScalarExprEmitter::
 VisitConditionalOperator(const ConditionalOperator *E) {
-  llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.?");
-  llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.:");
-  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.cont");
-  
   // Evaluate the conditional, then convert it to bool.  We do this explicitly
   // because we need the unconverted value if this is a GNU ?: expression with
   // missing middle value.
   Value *CondVal = CGF.EmitScalarExpr(E->getCond());
+
+  // If the condition folded to a constant, try to elide the dead side.  We
+  // can't do this if the dead side contains a label.
+  if (llvm::ConstantInt *CondCI = dyn_cast<llvm::ConstantInt>(CondVal)) {
+    Expr *Live = E->getLHS(), *Dead = E->getRHS();
+    if (CondCI->getZExtValue() == 0)
+      std::swap(Live, Dead);
+    if (!Dead || !CGF.ContainsLabel(Dead)) {
+      // Emit the live side.
+      if (Live)
+        return Visit(Live);
+      // Perform promotions, to handle cases like "short ?: int"
+      return EmitScalarConversion(CondVal, E->getCond()->getType(),
+                                  E->getType());
+    }   
+  }
+  
+  llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.?");
+  llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.:");
+  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.cont");
+  
   Value *CondBoolVal =CGF.EmitScalarConversion(CondVal, E->getCond()->getType(),
                                                CGF.getContext().BoolTy);
   Builder.CreateCondBr(CondBoolVal, LHSBlock, RHSBlock);