1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3 ; RUN: | FileCheck -check-prefix=RV32I %s
5 ; This test checks that LLVM can do basic stripping and reapplying of branches
8 declare void @test_true()
9 declare void @test_false()
11 ; !0 corresponds to a branch being taken, !1 to not being takne.
12 !0 = !{!"branch_weights", i32 64, i32 4}
13 !1 = !{!"branch_weights", i32 4, i32 64}
15 define void @test_bcc_fallthrough_taken(i32 %in) nounwind {
16 ; RV32I-LABEL: test_bcc_fallthrough_taken:
18 ; RV32I-NEXT: addi sp, sp, -16
19 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
20 ; RV32I-NEXT: li a1, 42
21 ; RV32I-NEXT: bne a0, a1, .LBB0_3
22 ; RV32I-NEXT: # %bb.1: # %true
23 ; RV32I-NEXT: call test_true@plt
24 ; RV32I-NEXT: .LBB0_2: # %true
25 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
26 ; RV32I-NEXT: addi sp, sp, 16
28 ; RV32I-NEXT: .LBB0_3: # %false
29 ; RV32I-NEXT: call test_false@plt
30 ; RV32I-NEXT: j .LBB0_2
31 %tst = icmp eq i32 %in, 42
32 br i1 %tst, label %true, label %false, !prof !0
34 ; Expected layout order is: Entry, TrueBlock, FalseBlock
35 ; Entry->TrueBlock is the common path, which should be taken whenever the
36 ; conditional branch is false.
39 call void @test_true()
43 call void @test_false()
47 define void @test_bcc_fallthrough_nottaken(i32 %in) nounwind {
48 ; RV32I-LABEL: test_bcc_fallthrough_nottaken:
50 ; RV32I-NEXT: addi sp, sp, -16
51 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
52 ; RV32I-NEXT: li a1, 42
53 ; RV32I-NEXT: beq a0, a1, .LBB1_3
54 ; RV32I-NEXT: # %bb.1: # %false
55 ; RV32I-NEXT: call test_false@plt
56 ; RV32I-NEXT: .LBB1_2: # %true
57 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
58 ; RV32I-NEXT: addi sp, sp, 16
60 ; RV32I-NEXT: .LBB1_3: # %true
61 ; RV32I-NEXT: call test_true@plt
62 ; RV32I-NEXT: j .LBB1_2
63 %tst = icmp eq i32 %in, 42
64 br i1 %tst, label %true, label %false, !prof !1
66 ; Expected layout order is: Entry, FalseBlock, TrueBlock
67 ; Entry->FalseBlock is the common path, which should be taken whenever the
68 ; conditional branch is false
71 call void @test_true()
75 call void @test_false()
79 ; TODO: how can we expand the coverage of the branch analysis functions?