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);