blob: 41ca8ac997136341a079a76fa6603a84325438cd [file] [log] [blame]
Richard Sandiford8a757bb2013-07-31 12:11:07 +00001; Test SystemZInstrInfo::AnalyzeBranch and SystemZInstrInfo::InsertBranch.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5declare void @foo() noreturn
6
7; Check a case where a separate branch is needed and where the original
8; order should be reversed.
Richard Sandiford93183ee2013-09-18 09:56:40 +00009define i32 @f1(i32 %a, i32 *%bptr) {
Richard Sandiford8a757bb2013-07-31 12:11:07 +000010; CHECK-LABEL: f1:
Richard Sandiford93183ee2013-09-18 09:56:40 +000011; CHECK: cl %r2, 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +000012; CHECK: jl .L[[LABEL:.*]]
Richard Sandiford8a757bb2013-07-31 12:11:07 +000013; CHECK: br %r14
14; CHECK: .L[[LABEL]]:
15; CHECK: brasl %r14, foo@PLT
16entry:
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000017 %b = load i32, i32 *%bptr
Richard Sandiford8a757bb2013-07-31 12:11:07 +000018 %cmp = icmp ult i32 %a, %b
19 br i1 %cmp, label %callit, label %return
20
21callit:
22 call void @foo()
23 unreachable
24
25return:
26 ret i32 1
27}
28
29; Same again with a fused compare and branch.
30define i32 @f2(i32 %a) {
31; CHECK-LABEL: f2:
Richard Sandiford3d768e32013-07-31 12:30:20 +000032; CHECK: cije %r2, 0, .L[[LABEL:.*]]
Richard Sandiford8a757bb2013-07-31 12:11:07 +000033; CHECK: br %r14
34; CHECK: .L[[LABEL]]:
35; CHECK: brasl %r14, foo@PLT
36entry:
37 %cmp = icmp eq i32 %a, 0
38 br i1 %cmp, label %callit, label %return
39
40callit:
41 call void @foo()
42 unreachable
43
44return:
45 ret i32 1
46}