summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/AVR
diff options
context:
space:
mode:
authorDylan McKay <me@dylanmckay.io>2019-05-21 06:38:02 +0000
committerDylan McKay <me@dylanmckay.io>2019-05-21 06:38:02 +0000
commite967308da43213c9c61696d77897f1d5dbc9eb94 (patch)
treed57fd26b0121f8aae24ae1aa21ae5bb3ac0c43af /llvm/test/CodeGen/AVR
parent690fa1b51beb7520b224ee4c9cb7c90d3bbe94e0 (diff)
downloadbcm5719-llvm-e967308da43213c9c61696d77897f1d5dbc9eb94.tar.gz
bcm5719-llvm-e967308da43213c9c61696d77897f1d5dbc9eb94.zip
Add TargetLoweringInfo hook for explicitly setting the ABI calling convention endianess
Summary: The endianess used in the calling convention does not always match the endianess of the target on all architectures, namely AVR. When an argument is too large to be legalised by the architecture and is split for the ABI, a new hook TargetLoweringInfo::shouldSplitFunctionArgumentsAsLittleEndian is queried to find the endianess that function arguments must be laid out in. This approach was recommended by Eli Friedman. Originally reported in https://github.com/avr-rust/rust/issues/129. Patch by Carl Peto. Reviewers: bogner, t.p.northover, RKSimon, niravd, efriedma Reviewed By: efriedma Subscribers: JDevlieghere, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D62003 llvm-svn: 361222
Diffstat (limited to 'llvm/test/CodeGen/AVR')
-rw-r--r--llvm/test/CodeGen/AVR/umul.with.overflow.i16-bug.ll49
1 files changed, 49 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AVR/umul.with.overflow.i16-bug.ll b/llvm/test/CodeGen/AVR/umul.with.overflow.i16-bug.ll
new file mode 100644
index 00000000000..4ea8f32b61d
--- /dev/null
+++ b/llvm/test/CodeGen/AVR/umul.with.overflow.i16-bug.ll
@@ -0,0 +1,49 @@
+; RUN: llc -O1 < %s -march=avr | FileCheck %s
+
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.9"
+
+%Vs6UInt16 = type <{ i16 }>
+%Sb = type <{ i1 }>
+
+define hidden void @setServoAngle(i16) {
+ ; CHECK-LABEL: entry
+entry:
+ %adjustedAngle = alloca %Vs6UInt16, align 2
+ %1 = bitcast %Vs6UInt16* %adjustedAngle to i8*
+ %adjustedAngle._value = getelementptr inbounds %Vs6UInt16, %Vs6UInt16* %adjustedAngle, i32 0, i32 0
+ store i16 %0, i16* %adjustedAngle._value, align 2
+
+;print(unsignedInt: adjustedAngle &* UInt16(11))
+; breaks here
+ %adjustedAngle._value2 = getelementptr inbounds %Vs6UInt16, %Vs6UInt16* %adjustedAngle, i32 0, i32 0
+ %2 = load i16, i16* %adjustedAngle._value2, align 2
+
+; CHECK: mov r22, r24
+; CHECK: mov r23, r25
+
+; CHECK-DAG: ldi r20, 0
+; CHECK-DAG: ldi r21, 0
+; CHECK-DAG: ldi r18, 11
+; CHECK-DAG: ldi r19, 0
+
+; CHECK: mov r24, r20
+; CHECK: mov r25, r21
+; CHECK: call __mulsi3
+ %3 = call { i16, i1 } @llvm.umul.with.overflow.i16(i16 %2, i16 11)
+ %4 = extractvalue { i16, i1 } %3, 0
+ %5 = extractvalue { i16, i1 } %3, 1
+
+ ; above code looks fine, how is it lowered?
+ %6 = call i1 @printDefaultParam()
+ call void @print(i16 %4, i1 %6)
+
+; CHECK: ret
+ ret void
+}
+
+declare void @print(i16, i1)
+declare i1 @printDefaultParam()
+
+; Function Attrs: nounwind readnone speculatable
+declare { i16, i1 } @llvm.umul.with.overflow.i16(i16, i16)
OpenPOWER on IntegriCloud