]> granicus.if.org Git - clang/commitdiff
Don't even try to directly emit the value of a DeclRefExpr if that declaration
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 7 Mar 2012 01:58:44 +0000 (01:58 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 7 Mar 2012 01:58:44 +0000 (01:58 +0000)
is not usable in a constant expression. ~2.5% speedup on 403.gcc / combine.c.

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

lib/CodeGen/CGExprScalar.cpp
test/CodeGenCXX/const-init-cxx11.cpp

index d5ef402d2299d0ec54a1bd1074d4822b264d4399..8ed36aac5f156ff75348d9e12df9acd5cee71739 100644 (file)
@@ -214,6 +214,14 @@ public:
     
   // l-values.
   Value *VisitDeclRefExpr(DeclRefExpr *E) {
+    VarDecl *VD = dyn_cast<VarDecl>(E->getDecl());
+    if (!VD && !isa<EnumConstantDecl>(E->getDecl()))
+      return EmitLoadOfLValue(E);
+    if (VD && !VD->isUsableInConstantExpressions())
+      return EmitLoadOfLValue(E);
+
+    // This is an enumerator or a variable which is usable in constant
+    // expressions. Try to emit its value instead.
     Expr::EvalResult Result;
     bool IsReferenceConstant = false;
     QualType EvalTy = E->getType();
@@ -232,10 +240,11 @@ public:
     llvm::Constant *C = CGF.CGM.EmitConstantValue(Result.Val, EvalTy, &CGF);
 
     // Make sure we emit a debug reference to the global variable.
-    if (VarDecl *VD = dyn_cast<VarDecl>(E->getDecl())) {
+    if (VD) {
       if (!CGF.getContext().DeclMustBeEmitted(VD))
         CGF.EmitDeclRefExprDbgValue(E, C);
-    } else if (isa<EnumConstantDecl>(E->getDecl())) {
+    } else {
+      assert(isa<EnumConstantDecl>(E->getDecl()));
       CGF.EmitDeclRefExprDbgValue(E, C);
     }
 
index a1486c117571cb65e14b7a047a208ec9dd63c220..8d92b81feb070e095ce61d317397f45044424acf 100644 (file)
@@ -370,7 +370,7 @@ namespace InitFromConst {
 
   const bool b = true;
   const int n = 5;
-  const double d = 4.3;
+  constexpr double d = 4.3;
 
   struct S { int n = 7; S *p = 0; };
   constexpr S s = S();