summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2014-05-04 23:13:21 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2014-05-04 23:13:21 +0000
commite8a7afef86220229a872b78b5e3dd212574d741a (patch)
tree9078e14b7806efbdf1835dd2361df881a830c92a /llvm
parent9c4716e4b6d2bd036ed4bc7a92407d74d7637bef (diff)
downloadbcm5719-llvm-e8a7afef86220229a872b78b5e3dd212574d741a.tar.gz
bcm5719-llvm-e8a7afef86220229a872b78b5e3dd212574d741a.zip
CodeGen: correct memset emittance for WoA
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. llvm-svn: 207943
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp3
-rw-r--r--llvm/test/CodeGen/ARM/Windows/memset.ll18
2 files changed, 20 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp b/llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp
index f3922035b6a..cb5812f6d26 100644
--- a/llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp
+++ b/llvm/lib/Target/ARM/ARMSelectionDAGInfo.cpp
@@ -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/llvm/test/CodeGen/ARM/Windows/memset.ll b/llvm/test/CodeGen/ARM/Windows/memset.ll
new file mode 100644
index 00000000000..bcf744c909d
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/Windows/memset.ll
@@ -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
+
OpenPOWER on IntegriCloud