OSDN Git Service

AArch64: Add missing branch relaxation tests
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 2 Aug 2016 07:41:05 +0000 (07:41 +0000)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 2 Aug 2016 07:41:05 +0000 (07:41 +0000)
The branch relaxation pass has the worst test coverage
of any pass in AArch64. Add a few tests that hit some
large pieces of code in the pass.

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

test/CodeGen/AArch64/branch-relax-bcc.ll [new file with mode: 0644]
test/CodeGen/AArch64/branch-relax-cbz.ll [new file with mode: 0644]

diff --git a/test/CodeGen/AArch64/branch-relax-bcc.ll b/test/CodeGen/AArch64/branch-relax-bcc.ll
new file mode 100644 (file)
index 0000000..d73236c
--- /dev/null
@@ -0,0 +1,77 @@
+; RUN: llc -mtriple=aarch64-apple-darwin -aarch64-bcc-offset-bits=3 < %s | FileCheck %s
+
+; CHECK-LABEL: invert_bcc:
+; CHECK:       fcmp s0, s1
+; CHECK-NEXT:  b.ne [[BB1:LBB[0-9]+_[0-9]+]]
+; CHECK-NEXT:  b.vs [[BB2:LBB[0-9]+_[0-9]+]]
+; CHECK-NEXT:  b [[BB2]]
+
+; CHECK: [[BB1]]:
+; CHECK: mov w{{[0-9]+}}, #9
+; CHECK: ret
+
+; CHECK: [[BB2]]:
+; CHECK: mov w{{[0-9]+}}, #42
+; CHECK: ret
+
+define i32 @invert_bcc(float %x, float %y) #0 {
+  %1 = fcmp ueq float %x, %y
+  br i1 %1, label %bb1, label %bb2
+
+bb2:
+  call void asm sideeffect
+    "nop
+     nop",
+    ""() #0
+  store volatile i32 9, i32* undef
+  ret i32 1
+
+bb1:
+  store volatile i32 42, i32* undef
+  ret i32 0
+}
+
+declare i32 @foo() #0
+
+; CHECK-LABEL: _block_split:
+; CHECK: cmp w0, #5
+; CHECK-NEXT: b.eq [[LONG_BR_BB:LBB[0-9]+_[0-9]+]]
+; CHECK-NEXT: b [[LOR_LHS_FALSE_BB:LBB[0-9]+_[0-9]+]]
+
+; CHECK: [[LONG_BR_BB]]:
+; CHECK-NEXT: b [[IF_THEN_BB:LBB[0-9]+_[0-9]+]]
+
+; CHECK: [[LOR_LHS_FALSE_BB]]:
+; CHECK: cmp w{{[0-9]+}}, #16
+; CHECK-NEXT: b.le [[IF_THEN_BB]]
+; CHECK-NEXT: b [[IF_END_BB:LBB[0-9]+_[0-9]+]]
+
+; CHECK: [[IF_THEN_BB]]:
+; CHECK: bl _foo
+; CHECK-NOT: b L
+
+; CHECK: [[IF_END_BB]]:
+; CHECK: #0x7
+; CHECK: ret
+define i32 @block_split(i32 %a, i32 %b) #0 {
+entry:
+  %cmp = icmp eq i32 %a, 5
+  br i1 %cmp, label %if.then, label %lor.lhs.false
+
+lor.lhs.false:                                    ; preds = %entry
+  %cmp1 = icmp slt i32 %b, 7
+  %mul = shl nsw i32 %b, 1
+  %add = add nsw i32 %b, 1
+  %cond = select i1 %cmp1, i32 %mul, i32 %add
+  %cmp2 = icmp slt i32 %cond, 17
+  br i1 %cmp2, label %if.then, label %if.end
+
+if.then:                                          ; preds = %lor.lhs.false, %entry
+  %call = tail call i32 @foo()
+  br label %if.end
+
+if.end:                                           ; preds = %if.then, %lor.lhs.false
+  ret i32 7
+}
+
+attributes #0 = { nounwind }
diff --git a/test/CodeGen/AArch64/branch-relax-cbz.ll b/test/CodeGen/AArch64/branch-relax-cbz.ll
new file mode 100644 (file)
index 0000000..c654b94
--- /dev/null
@@ -0,0 +1,51 @@
+; RUN: llc -mtriple=aarch64-apple-darwin -aarch64-cbz-offset-bits=3 < %s | FileCheck %s
+
+; CHECK-LABEL: _split_block_no_fallthrough:
+; CHECK: cmn x{{[0-9]+}}, #5
+; CHECK-NEXT: b.le [[B2:LBB[0-9]+_[0-9]+]]
+
+; CHECK-NEXT: ; BB#1: ; %b3
+; CHECK: ldr [[LOAD:w[0-9]+]]
+; CHECK: cbz [[LOAD]], [[SKIP_LONG_B:LBB[0-9]+_[0-9]+]]
+; CHECK-NEXT: b [[B8:LBB[0-9]+_[0-9]+]]
+
+; CHECK-NEXT: [[SKIP_LONG_B]]:
+; CHECK-NEXT: b [[B7:LBB[0-9]+_[0-9]+]]
+
+; CHECK-NEXT: [[B2]]: ; %b2
+; CHECK: mov w{{[0-9]+}}, #93
+; CHECK: bl _extfunc
+; CHECK: cbz w{{[0-9]+}}, [[B7]]
+
+; CHECK-NEXT: [[B8]]: ; %b8
+; CHECK-NEXT: ret
+
+; CHECK-NEXT: [[B7]]: ; %b7
+; CHECK: mov w{{[0-9]+}}, #13
+; CHECK: b _extfunc
+define void @split_block_no_fallthrough(i64 %val) #0 {
+bb:
+  %c0 = icmp sgt i64 %val, -5
+  br i1 %c0, label %b3, label %b2
+
+b2:
+  %v0 = tail call i32 @extfunc(i32 93)
+  %c1 = icmp eq i32 %v0, 0
+  br i1 %c1, label %b7, label %b8
+
+b3:
+  %v1 = load volatile i32, i32* undef, align 4
+  %c2 = icmp eq i32 %v1, 0
+  br i1 %c2, label %b7, label %b8
+
+b7:
+  %tmp1 = tail call i32 @extfunc(i32 13)
+  ret void
+
+b8:
+  ret void
+}
+
+declare i32 @extfunc(i32) #0
+
+attributes #0 = { nounwind }