Hi Richard, This broke bootstrap when building Debug.cpp. Can you investigate please?
I will revert shortly... - Daniel On Thu, Mar 1, 2012 at 7:16 PM, Richard Smith <[email protected]> wrote: > Author: rsmith > Date: Thu Mar 1 21:16:32 2012 > New Revision: 151879 > > URL: http://llvm.org/viewvc/llvm-project?rev=151879&view=rev > Log: > PR12145: Avoid emitting loads of constexpr variables in contexts where there > is no odr-use of the variable. Go slightly beyond what the standard requires > for variables of reference type. > > Modified: > cfe/trunk/lib/CodeGen/CGExprScalar.cpp > cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp > > Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=151879&r1=151878&r2=151879&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Thu Mar 1 21:16:32 2012 > @@ -212,18 +212,21 @@ > // l-values. > Value *VisitDeclRefExpr(DeclRefExpr *E) { > Expr::EvalResult Result; > - if (!E->EvaluateAsRValue(Result, CGF.getContext())) > - return EmitLoadOfLValue(E); > + 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(); > + } > > assert(!Result.HasSideEffects && "Constant declref with side-effect?!"); > > - 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); > + 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())) { > @@ -233,6 +236,9 @@ > CGF.EmitDeclRefExprDbgValue(E, C); > } > > + if (IsReferenceConstant) > + return EmitLoadOfLValue(CGF.MakeNaturalAlignAddrLValue(C, > E->getType())); > + > return C; > } > Value *VisitObjCSelectorExpr(ObjCSelectorExpr *E) { > > Modified: cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp?rev=151879&r1=151878&r2=151879&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp Thu Mar 1 21:16:32 2012 > @@ -337,3 +337,30 @@ > 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: %0 = load i32* @_ZN12Unreferenced1nE > + // CHECK-NEXT: store i32 %0, 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) > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
