summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2016-07-28 19:13:46 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2016-07-28 19:13:46 +0000
commitc43644d33289ea9c40d8fca4f2a666739a57d4a3 (patch)
tree447737ff1d7e1fa5bd3ad28affdf4258aad4cd63 /llvm/test
parentd66889cbae749ceffca88f094274e2d64c2cb8f8 (diff)
downloadbcm5719-llvm-c43644d33289ea9c40d8fca4f2a666739a57d4a3.tar.gz
bcm5719-llvm-c43644d33289ea9c40d8fca4f2a666739a57d4a3.zip
[Hexagon] Insert CFI instructions before throwing calls
Normally, CFI instructions should be inserted after allocframe, but if allocframe is in the same packet with a call, the CFI instructions should be inserted before that packet. llvm-svn: 277020
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/Hexagon/packetize-cfi-location.ll72
1 files changed, 72 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/Hexagon/packetize-cfi-location.ll b/llvm/test/CodeGen/Hexagon/packetize-cfi-location.ll
new file mode 100644
index 00000000000..0d80a7bb289
--- /dev/null
+++ b/llvm/test/CodeGen/Hexagon/packetize-cfi-location.ll
@@ -0,0 +1,72 @@
+; RUN: llc -march=hexagon < %s | FileCheck %s
+
+target triple = "hexagon"
+%type.0 = type { i32, i8**, i32, i32, i32 }
+
+; Check that CFI is before the packet with call+allocframe.
+; CHECK-LABEL: danny:
+; CHECK: cfi_def_cfa
+; CHECK: call throw
+; CHECK-NEXT: allocframe
+
+; Expect packet:
+; {
+; call throw
+; allocframe(#0)
+; }
+
+define i8* @danny(%type.0* %p0, i32 %p1) #0 {
+entry:
+ %t0 = getelementptr inbounds %type.0, %type.0* %p0, i32 0, i32 4
+ %t1 = load i32, i32* %t0, align 4
+ %th = icmp ugt i32 %t1, %p1
+ br i1 %th, label %if.end, label %if.then
+
+if.then: ; preds = %entry
+ tail call void @throw(%type.0* nonnull %p0)
+ unreachable
+
+if.end: ; preds = %entry
+ %t6 = getelementptr inbounds %type.0, %type.0* %p0, i32 0, i32 3
+ %t2 = load i32, i32* %t6, align 4
+ %t9 = add i32 %t2, %p1
+ %ta = lshr i32 %t9, 4
+ %tb = and i32 %t9, 15
+ %t7 = getelementptr inbounds %type.0, %type.0* %p0, i32 0, i32 2
+ %t3 = load i32, i32* %t7, align 4
+ %tc = icmp ult i32 %ta, %t3
+ %td = select i1 %tc, i32 0, i32 %t3
+ %te = sub i32 %ta, %td
+ %t8 = getelementptr inbounds %type.0, %type.0* %p0, i32 0, i32 1
+ %t4 = load i8**, i8*** %t8, align 4
+ %tf = getelementptr inbounds i8*, i8** %t4, i32 %te
+ %t5 = load i8*, i8** %tf, align 4
+ %tg = getelementptr inbounds i8, i8* %t5, i32 %tb
+ ret i8* %tg
+}
+
+; Check that CFI is after allocframe.
+; CHECK-LABEL: sammy:
+; CHECK: allocframe
+; CHECK: cfi_def_cfa
+
+define void @sammy(%type.0* %p0, i32 %p1) #0 {
+entry:
+ %t0 = icmp sgt i32 %p1, 0
+ br i1 %t0, label %if.then, label %if.else
+if.then:
+ call void @throw(%type.0* nonnull %p0)
+ br label %if.end
+if.else:
+ call void @nothrow() #2
+ br label %if.end
+if.end:
+ ret void
+}
+
+declare void @throw(%type.0*) #1
+declare void @nothrow() #2
+
+attributes #0 = { "target-cpu"="hexagonv55" }
+attributes #1 = { noreturn "target-cpu"="hexagonv55" }
+attributes #2 = { nounwind "target-cpu"="hexagonv55" }
OpenPOWER on IntegriCloud