forked from OSchip/llvm-project
Revert r151879, r151880, "PR12145: Avoid emitting loads of constexpr variables in contexts where there" and "Fix buildbot: make this test less dependent on the value names in the produced IR."
They broke bootstrap. llvm-svn: 151922
This commit is contained in:
parent
9370ecff74
commit
d01281fe0d
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue