From 5d4d2680c16032e56836ef5e2fa0f0be72c1312d Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Tue, 2 Aug 2016 07:41:05 +0000 Subject: [PATCH] AArch64: Add missing branch relaxation tests 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 | 77 ++++++++++++++++++++++++++++++++ test/CodeGen/AArch64/branch-relax-cbz.ll | 51 +++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 test/CodeGen/AArch64/branch-relax-bcc.ll create mode 100644 test/CodeGen/AArch64/branch-relax-cbz.ll diff --git a/test/CodeGen/AArch64/branch-relax-bcc.ll b/test/CodeGen/AArch64/branch-relax-bcc.ll new file mode 100644 index 00000000000..d73236c9381 --- /dev/null +++ b/test/CodeGen/AArch64/branch-relax-bcc.ll @@ -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 index 00000000000..c654b94e49c --- /dev/null +++ b/test/CodeGen/AArch64/branch-relax-cbz.ll @@ -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 } -- 2.11.0