[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