]> granicus.if.org Git - clang/commitdiff
Try to not emit the dead side of ?: if the condition is a constant.
authorChris Lattner <sabre@nondot.org>
Tue, 11 Nov 2008 18:56:45 +0000 (18:56 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 11 Nov 2008 18:56:45 +0000 (18:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59061 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprScalar.cpp

index 82f0cc7e77732cdc52221eeec633526646a87d18..bf22902b68ba3c6ed1de68b94415a0fd7b106f59 100644 (file)
@@ -1110,14 +1110,31 @@ Value *ScalarExprEmitter::VisitBinComma(const BinaryOperator *E) {
 
 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);