; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 ; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefix=CHEAP ; RUN: llc < %s -mtriple=riscv64 -jump-is-expensive=0 | FileCheck %s --check-prefix=CHEAP ; RUN: llc < %s -mtriple=riscv64 -jump-is-expensive=1 | FileCheck %s --check-prefix=EXPENSIVE define void @foo(i32 %X, i32 %Y, i32 %Z) nounwind { ; CHEAP-LABEL: foo: ; CHEAP: # %bb.0: # %entry ; CHEAP-NEXT: sext.w a1, a1 ; CHEAP-NEXT: li a2, 5 ; CHEAP-NEXT: blt a1, a2, .LBB0_3 ; CHEAP-NEXT: # %bb.1: # %entry ; CHEAP-NEXT: sext.w a0, a0 ; CHEAP-NEXT: beqz a0, .LBB0_3 ; CHEAP-NEXT: # %bb.2: # %UnifiedReturnBlock ; CHEAP-NEXT: ret ; CHEAP-NEXT: .LBB0_3: # %cond_true ; CHEAP-NEXT: tail bar ; ; EXPENSIVE-LABEL: foo: ; EXPENSIVE: # %bb.0: # %entry ; EXPENSIVE-NEXT: sext.w a1, a1 ; EXPENSIVE-NEXT: sext.w a0, a0 ; EXPENSIVE-NEXT: seqz a0, a0 ; EXPENSIVE-NEXT: slti a1, a1, 5 ; EXPENSIVE-NEXT: or a0, a0, a1 ; EXPENSIVE-NEXT: beqz a0, .LBB0_2 ; EXPENSIVE-NEXT: # %bb.1: # %cond_true ; EXPENSIVE-NEXT: tail bar ; EXPENSIVE-NEXT: .LBB0_2: # %UnifiedReturnBlock ; EXPENSIVE-NEXT: ret entry: %tmp1 = icmp eq i32 %X, 0 %tmp3 = icmp slt i32 %Y, 5 %tmp4 = or i1 %tmp3, %tmp1 br i1 %tmp4, label %cond_true, label %UnifiedReturnBlock cond_true: %tmp5 = tail call i32 (...) @bar( ) ret void UnifiedReturnBlock: ret void } ; If the branch is unpredictable, don't add another branch ; regardless of whether they are expensive or not. define void @unpredictable(i32 %X, i32 %Y, i32 %Z) nounwind { ; CHEAP-LABEL: unpredictable: ; CHEAP: # %bb.0: # %entry ; CHEAP-NEXT: sext.w a1, a1 ; CHEAP-NEXT: sext.w a0, a0 ; CHEAP-NEXT: seqz a0, a0 ; CHEAP-NEXT: slti a1, a1, 5 ; CHEAP-NEXT: or a0, a0, a1 ; CHEAP-NEXT: beqz a0, .LBB1_2 ; CHEAP-NEXT: # %bb.1: # %cond_true ; CHEAP-NEXT: tail bar ; CHEAP-NEXT: .LBB1_2: # %UnifiedReturnBlock ; CHEAP-NEXT: ret ; ; EXPENSIVE-LABEL: unpredictable: ; EXPENSIVE: # %bb.0: # %entry ; EXPENSIVE-NEXT: sext.w a1, a1 ; EXPENSIVE-NEXT: sext.w a0, a0 ; EXPENSIVE-NEXT: seqz a0, a0 ; EXPENSIVE-NEXT: slti a1, a1, 5 ; EXPENSIVE-NEXT: or a0, a0, a1 ; EXPENSIVE-NEXT: beqz a0, .LBB1_2 ; EXPENSIVE-NEXT: # %bb.1: # %cond_true ; EXPENSIVE-NEXT: tail bar ; EXPENSIVE-NEXT: .LBB1_2: # %UnifiedReturnBlock ; EXPENSIVE-NEXT: ret entry: %tmp1 = icmp eq i32 %X, 0 %tmp3 = icmp slt i32 %Y, 5 %tmp4 = or i1 %tmp3, %tmp1 br i1 %tmp4, label %cond_true, label %UnifiedReturnBlock, !unpredictable !0 cond_true: %tmp5 = tail call i32 (...) @bar( ) ret void UnifiedReturnBlock: ret void } declare i32 @bar(...) !0 = !{}