gollvm: extend constant handling fixes
This extends the fix from #45932 to the helper routine
Llvm_backend::genStore, which was also (in certain cases) spilling
values that were not llvm::Constants but actually not actually
constant in practice (eg: a global variable).
Change-Id: Ie805f31e6a89dd91826d7495292d51969bc9b4ce
Reviewed-on: https://go-review.googlesource.com/46418
Reviewed-by: Cherry Zhang <cherryyz@google.com>
diff --git a/llvm-gofrontend/go-llvm.cpp b/llvm-gofrontend/go-llvm.cpp
index a699403..2a4f6f4 100644
--- a/llvm-gofrontend/go-llvm.cpp
+++ b/llvm-gofrontend/go-llvm.cpp
@@ -716,6 +716,7 @@
llvm::Value *Llvm_backend::genStore(BlockLIRBuilder *builder,
Btype *srcType,
+ bool srcConstant,
llvm::Type *dstType,
llvm::Value *srcVal,
llvm::Value *dstLoc)
@@ -750,7 +751,7 @@
// memcpy src: handle constant input (we need something addressable
// in order to do a memcpy, not a raw constant value)
- if (llvm::isa<llvm::Constant>(srcVal)) {
+ if (srcConstant) {
llvm::Constant *cval = llvm::cast<llvm::Constant>(srcVal);
Bvariable *cvar = genVarForConstant(cval, srcType);
srcVal = cvar->value();
@@ -786,6 +787,7 @@
llvm::Value *val = valexp->value();
llvm::Value *dst = dstExpr->value();
llvm::Value *result = genStore(&builder, srcExpr->btype(),
+ valexp->isConstant(),
dstExpr->value()->getType(),
val, dst);
@@ -828,8 +830,8 @@
Bexpression *valexp = resolve(aexprs[eidx], ctx);
// Store field value into GEP
- genStore(&builder, valexp->btype(), gep->getType(),
- valexp->value(), gep);
+ genStore(&builder, valexp->btype(), valexp->isConstant(),
+ gep->getType(), valexp->value(), gep);
values.push_back(valexp);
}
@@ -870,8 +872,8 @@
0, fidx, tag);
// Store field value into GEP
- genStore(&builder, valexp->btype(), gep->getType(),
- valexp->value(), gep);
+ genStore(&builder, valexp->btype(), valexp->isConstant(),
+ gep->getType(), valexp->value(), gep);
values.push_back(valexp);
}
diff --git a/llvm-gofrontend/go-llvm.h b/llvm-gofrontend/go-llvm.h
index 1461682..52ae2b9 100644
--- a/llvm-gofrontend/go-llvm.h
+++ b/llvm-gofrontend/go-llvm.h
@@ -507,6 +507,7 @@
// Lower-level version of the above
llvm::Value *genStore(BlockLIRBuilder *builder,
Btype *srcType,
+ bool srcConstant,
llvm::Type *dstType,
llvm::Value *srcValue,
llvm::Value *dstLoc);