aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp13
-rw-r--r--test/CodeGen/PowerPC/2007-10-23-UnalignedMemcpy.ll13
2 files changed, 26 insertions, 0 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 610c898..71999b4 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -4329,6 +4329,19 @@ void SelectionDAGLowering::visitMemIntrinsic(CallInst &I, unsigned Op) {
}
}
+ // Check to see if there is an unaligned memcpy from/onto the stack. If
+ // so, then ignore it for the present.
+ if (Op1.getOpcode() == ISD::FrameIndex ||
+ Op2.getOpcode() == ISD::FrameIndex) {
+ unsigned TotalSize = 0;
+
+ for (unsigned i = 0; i < NumMemOps; i++)
+ TotalSize += MVT::getSizeInBits(MemOps[i]) / 8;
+
+ if (TotalSize % Align != 0)
+ break;
+ }
+
for (unsigned i = 0; i < NumMemOps; i++) {
MVT::ValueType VT = MemOps[i];
unsigned VTSize = MVT::getSizeInBits(VT) / 8;
diff --git a/test/CodeGen/PowerPC/2007-10-23-UnalignedMemcpy.ll b/test/CodeGen/PowerPC/2007-10-23-UnalignedMemcpy.ll
new file mode 100644
index 0000000..c0cf201
--- /dev/null
+++ b/test/CodeGen/PowerPC/2007-10-23-UnalignedMemcpy.ll
@@ -0,0 +1,13 @@
+; RUN: llvm-as < %s | llc -mtriple=powerpc64-apple-darwin9 -o - | grep memcpy
+
+@C.0.1173 = external constant [33 x i8] ; <[33 x i8]*> [#uses=1]
+
+define void @Bork() {
+entry:
+ %Qux = alloca [33 x i8] ; <[33 x i8]*> [#uses=1]
+ %Qux1 = bitcast [33 x i8]* %Qux to i8* ; <i8*> [#uses=1]
+ call void @llvm.memcpy.i64( i8* %Qux1, i8* getelementptr ([33 x i8]* @C.0.1173, i32 0, i32 0), i64 33, i32 8 )
+ ret void
+}
+
+declare void @llvm.memcpy.i64(i8*, i8*, i64, i32)