[cfe-commits] r151879 - in /cfe/trunk: lib/CodeGen/CGExprScalar.cpp test/CodeGenCXX/const-init-cxx11.cpp
Daniel Dunbar
daniel at zuster.org
Fri Mar 2 07:58:44 PST 2012
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
<richard-llvm at metafoo.co.uk> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list