]> granicus.if.org Git - clang/commitdiff
Revert r151879, r151880, "PR12145: Avoid emitting loads of constexpr variables in...
authorDaniel Dunbar <daniel@zuster.org>
Fri, 2 Mar 2012 16:24:25 +0000 (16:24 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 2 Mar 2012 16:24:25 +0000 (16:24 +0000)
They broke bootstrap.

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

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

index f7ab880e6cd07b058e40fa93cb6d56f85ccac350..125e431bff0a8a76a2cfcab14b2686ede28930b7 100644 (file)
@@ -212,21 +212,18 @@ public:
   // l-values.
   Value *VisitDeclRefExpr(DeclRefExpr *E) {
     Expr::EvalResult Result;
-    bool IsReferenceConstant = false;
-    QualType EvalTy = E->getType();
-    if (!E->EvaluateAsRValue(Result, CGF.getContext())) {
-      // If this is a reference, try to determine what it is bound to.
-      if (!E->getDecl()->getType()->isReferenceType() ||
-          !E->EvaluateAsLValue(Result, CGF.getContext()))
-        return EmitLoadOfLValue(E);
-
-      IsReferenceConstant = true;
-      EvalTy = E->getDecl()->getType();
-    }
+    if (!E->EvaluateAsRValue(Result, CGF.getContext()))
+      return EmitLoadOfLValue(E);
 
     assert(!Result.HasSideEffects && "Constant declref with side-effect?!");
 
-    llvm::Constant *C = CGF.CGM.EmitConstantValue(Result.Val, EvalTy, &CGF);
+    llvm::Constant *C;
+    if (Result.Val.isInt())
+      C = Builder.getInt(Result.Val.getInt());
+    else if (Result.Val.isFloat())
+      C = llvm::ConstantFP::get(VMContext, Result.Val.getFloat());
+    else
+      return EmitLoadOfLValue(E);
 
     // Make sure we emit a debug reference to the global variable.
     if (VarDecl *VD = dyn_cast<VarDecl>(E->getDecl())) {
@@ -236,9 +233,6 @@ public:
       CGF.EmitDeclRefExprDbgValue(E, C);
     }
 
-    if (IsReferenceConstant)
-      return EmitLoadOfLValue(CGF.MakeNaturalAlignAddrLValue(C, E->getType()));
-
     return C;
   }
   Value *VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
index e2a11c295f059741ddaf45fdd940ee6be1f85f94..5366d6d485585e94eea5425133b390a8f756fd77 100644 (file)
@@ -337,30 +337,3 @@ namespace VirtualBase {
   X<D> x;
   // CHECK: call {{.*}}@_ZN11VirtualBase1XINS_1DEEC1Ev
 }
-
-// PR12145
-namespace Unreferenced {
-  int n;
-  constexpr int *p = &n;
-  // We must not emit a load of 'p' here, since it's not odr-used.
-  int q = *p;
-  // CHECK-NOT: _ZN12Unreferenced1pE
-  // CHECK: = load i32* @_ZN12Unreferenced1nE
-  // CHECK-NEXT: store i32 {{.*}}, i32* @_ZN12Unreferenced1qE
-  // CHECK-NOT: _ZN12Unreferenced1pE
-
-  // Technically, we are not required to substitute variables of reference types
-  // initialized by constant expressions, because the special case for odr-use
-  // of variables in [basic.def.odr]p2 only applies to objects. But we do so
-  // anyway.
-
-  constexpr int &r = n;
-  // CHECK-NOT: _ZN12Unreferenced1rE
-  int s = r;
-
-  const int t = 1;
-  const int &rt = t;
-  int f(int);
-  int u = f(rt);
-  // CHECK: call i32 @_ZN12Unreferenced1fEi(i32 1)
-}