Fix a bug in InstCombine where we would incorrectly attempt to construct a
authorOwen Anderson <resistor@mac.com>
Thu, 13 Mar 2014 22:51:43 +0000 (22:51 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 13 Mar 2014 22:51:43 +0000 (22:51 +0000)
bitcast between pointers of two different address spaces if they happened to have
the same pointer size.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203862 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
test/Transforms/InstCombine/load-addrspace-cast.ll [new file with mode: 0644]

index 1db55fea008deebd2d75cfb627c20ff4b1fda7ec..a34acdd8320b191a5df55c18445bad3a2af726cf 100644 (file)
@@ -335,6 +335,13 @@ static Instruction *InstCombineLoadCast(InstCombiner &IC, LoadInst &LI,
         NewLoad->setAlignment(LI.getAlignment());
         NewLoad->setAtomic(LI.getOrdering(), LI.getSynchScope());
         // Now cast the result of the load.
+        PointerType *OldTy = dyn_cast<PointerType>(NewLoad->getType());
+        PointerType *NewTy = dyn_cast<PointerType>(LI.getType());
+        if (OldTy && NewTy &&
+            OldTy->getAddressSpace() != NewTy->getAddressSpace()) {
+          return new AddrSpaceCastInst(NewLoad, LI.getType());
+        }
+
         return new BitCastInst(NewLoad, LI.getType());
       }
     }
diff --git a/test/Transforms/InstCombine/load-addrspace-cast.ll b/test/Transforms/InstCombine/load-addrspace-cast.ll
new file mode 100644 (file)
index 0000000..fd6339c
--- /dev/null
@@ -0,0 +1,12 @@
+; RUN: opt -instcombine -S < %s | FileCheck %s
+target datalayout = "e-p:64:64:64-n8:16:32:64"
+
+define i32* @pointer_to_addrspace_pointer(i32 addrspace(1)** %x) nounwind {
+; CHECK-LABEL: @pointer_to_addrspace_pointer(
+; CHECK: load
+; CHECK: addrspacecast
+  %y = bitcast i32 addrspace(1)** %x to i32**
+  %z = load i32** %y
+  ret i32* %z
+}
+