bridge: fix circular pointer handling in non-integral pointer mode

In non-integral pointer mode, the pointer can be in either
address space. Handle this.

Change-Id: I15f185236cb8410409fe280077c5807b489d50c8
Reviewed-on: https://go-review.googlesource.com/c/157239
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/bridge/go-llvm.cpp b/bridge/go-llvm.cpp
index 0d605cb..a371811 100644
--- a/bridge/go-llvm.cpp
+++ b/bridge/go-llvm.cpp
@@ -542,19 +542,20 @@
                                                  Location loc)
 {
   llvm::Value *val = expr->value();
+  llvm::Type *vt = val->getType();
+  assert(vt->isPointerTy());
   llvm::Type *llToType = toType->type();
   if (expr->varExprPending()) {
-    llvm::Type *pet = llvm::PointerType::get(expr->btype()->type(),
-                                             addressSpace_);
-    if (val->getType() == pet)
-      llToType = llvm::PointerType::get(llToType, addressSpace_);
+    llvm::Type *et = expr->btype()->type();
+    if (vt->getPointerElementType() == et)
+      llToType = llvm::PointerType::get(llToType, vt->getPointerAddressSpace());
   }
-  if (val->getType() == llToType)
+  if (vt == llToType)
     return expr;
 
   std::string tag(namegen("cast"));
   LIRBuilder builder(context_, llvm::ConstantFolder());
-  llvm::Value *bitcast = builder.CreateBitCast(val, llToType, tag);
+  llvm::Value *bitcast = builder.CreatePointerBitCastOrAddrSpaceCast(val, llToType, tag);
   return nbuilder_.mkConversion(toType, bitcast, expr, loc);
 }