Fix a bug in GVN that Duncan noticed, where we potentially need to insert a
authorOwen Anderson <resistor@mac.com>
Thu, 13 Mar 2008 22:07:10 +0000 (22:07 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 13 Mar 2008 22:07:10 +0000 (22:07 +0000)
pointer bitcast when performing return slot optimization.

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

lib/Transforms/Scalar/GVN.cpp
test/Transforms/GVN/2008-03-13-ReturnSlotBitcast.ll [new file with mode: 0644]

index 545f7091cc1c465ef2eedf820b929d05dfe8f580..1d764af6888feee0facd1b65bd01216ff303c740 100644 (file)
@@ -1171,8 +1171,12 @@ bool GVN::performCallSlotOptzn(MemCpyInst* cpy, CallInst* C,
 
   // All the checks have passed, so do the transformation.
   for (unsigned i = 0; i < CS.arg_size(); ++i)
-    if (CS.getArgument(i) == cpySrc)
+    if (CS.getArgument(i) == cpySrc) {
+      if (cpySrc->getType() != cpyDest->getType())
+        cpyDest = CastInst::createPointerCast(cpyDest, cpySrc->getType(),
+                                              cpyDest->getName(), C);
       CS.setArgument(i, cpyDest);
+    }
 
   // Drop any cached information about the call, because we may have changed
   // its dependence information by changing its parameter.
diff --git a/test/Transforms/GVN/2008-03-13-ReturnSlotBitcast.ll b/test/Transforms/GVN/2008-03-13-ReturnSlotBitcast.ll
new file mode 100644 (file)
index 0000000..7757a92
--- /dev/null
@@ -0,0 +1,19 @@
+; RUN: llvm-as < %s | opt -gvn | llvm-dis | not grep {call.*memcpy.}
+       %a = type { i32 }
+       %b = type { float }
+
+declare void @llvm.memcpy.i32(i8*, i8*, i32, i32) nounwind 
+declare void @g(%a*)
+
+define float @f() {
+entry:
+       %a_var = alloca %a
+       %b_var = alloca %b
+       call void @g(%a *%a_var)
+       %a_i8 = bitcast %a* %a_var to i8*
+       %b_i8 = bitcast %b* %b_var to i8*
+       call void @llvm.memcpy.i32(i8* %b_i8, i8* %a_i8, i32 4, i32 4)
+       %tmp1 = getelementptr %b* %b_var, i32 0, i32 0
+       %tmp2 = load float* %tmp1
+       ret float %tmp2
+}