CodeGen: correct memset emittance for WoA
authorSaleem Abdulrasool <compnerd@compnerd.org>
Sun, 4 May 2014 23:13:21 +0000 (23:13 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Sun, 4 May 2014 23:13:21 +0000 (23:13 +0000)
Windows on ARM does not conform to AEABI.  However, memset would be emitted
using the AEABI signature, resulting in inverted parameters.  Handle this
special case appropriately.

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

lib/Target/ARM/ARMSelectionDAGInfo.cpp
test/CodeGen/ARM/Windows/memset.ll [new file with mode: 0644]

index f3922035b6a76267bdc46863df593bbb37a5bc47..cb5812f6d269d255367aa1f81d601a1f1ac868c3 100644 (file)
@@ -151,7 +151,8 @@ EmitTargetCodeForMemset(SelectionDAG &DAG, SDLoc dl,
                         unsigned Align, bool isVolatile,
                         MachinePointerInfo DstPtrInfo) const {
   // Use default for non-AAPCS (or MachO) subtargets
-  if (!Subtarget->isAAPCS_ABI() || Subtarget->isTargetMachO())
+  if (!Subtarget->isAAPCS_ABI() || Subtarget->isTargetMachO() ||
+      Subtarget->isTargetWindows())
     return SDValue();
 
   const ARMTargetLowering &TLI =
diff --git a/test/CodeGen/ARM/Windows/memset.ll b/test/CodeGen/ARM/Windows/memset.ll
new file mode 100644 (file)
index 0000000..bcf744c
--- /dev/null
@@ -0,0 +1,18 @@
+; RUN: llc -mtriple thumbv7--windows-itanium -filetype asm -o - %s | FileCheck %s
+
+@source = common global [512 x i8] zeroinitializer, align 4
+
+declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
+
+define void @function() {
+entry:
+  call void @llvm.memset.p0i8.i32(i8* bitcast ([512 x i8]* @source to i8*), i8 0, i32 512, i32 0, i1 false)
+  unreachable
+}
+
+; CHECK: movs r1, #0
+; CHECK: mov.w r2, #512
+; CHECK: movw r0, :lower16:source
+; CHECK: movt r0, :upper16:source
+; CHECK: memset
+