xref: /llvm-project/llvm/test/CodeGen/RISCV/convert-highly-predictable-select-to-branch.ll (revision d36a4c07156de01b05ea41d5876c671de64e99c6)
123aff11eSPengcheng Wang; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
223aff11eSPengcheng Wang; RUN: llc -mtriple=riscv64 -mattr=+zicond < %s | FileCheck %s --check-prefixes=CHECK,CHEAP
323aff11eSPengcheng Wang; RUN: llc -mtriple=riscv64 -mattr=+zicond,+predictable-select-expensive < %s | FileCheck %s --check-prefixes=CHECK,EXPENSIVE
423aff11eSPengcheng Wang
523aff11eSPengcheng Wang; Test has not predictable select, which should not be transformed to a branch
623aff11eSPengcheng Wangdefine i32 @test1(i32 %a) {
723aff11eSPengcheng Wang; CHECK-LABEL: test1:
823aff11eSPengcheng Wang; CHECK:       # %bb.0: # %entry
923aff11eSPengcheng Wang; CHECK-NEXT:    sext.w a1, a0
1023aff11eSPengcheng Wang; CHECK-NEXT:    slti a1, a1, 1
1123aff11eSPengcheng Wang; CHECK-NEXT:    addiw a0, a0, -1
1223aff11eSPengcheng Wang; CHECK-NEXT:    czero.nez a0, a0, a1
1323aff11eSPengcheng Wang; CHECK-NEXT:    ret
1423aff11eSPengcheng Wangentry:
1523aff11eSPengcheng Wang  %cmp = icmp slt i32 %a, 1
1623aff11eSPengcheng Wang  %dec = sub i32 %a, 1
1723aff11eSPengcheng Wang  %res = select i1 %cmp, i32 0, i32 %dec, !prof !0
1823aff11eSPengcheng Wang  ret i32 %res
1923aff11eSPengcheng Wang}
2023aff11eSPengcheng Wang
2123aff11eSPengcheng Wang; Test has highly predictable select according to profile data,
22*d36a4c07SPengcheng Wang; which should be transformed to a branch on cores with enabled TunePredictableSelectIsExpensive
2323aff11eSPengcheng Wangdefine i32 @test2(i32 %a) {
2423aff11eSPengcheng Wang; CHEAP-LABEL: test2:
2523aff11eSPengcheng Wang; CHEAP:       # %bb.0: # %entry
2623aff11eSPengcheng Wang; CHEAP-NEXT:    sext.w a1, a0
2723aff11eSPengcheng Wang; CHEAP-NEXT:    slti a1, a1, 1
2823aff11eSPengcheng Wang; CHEAP-NEXT:    addiw a0, a0, -1
2923aff11eSPengcheng Wang; CHEAP-NEXT:    czero.nez a0, a0, a1
3023aff11eSPengcheng Wang; CHEAP-NEXT:    ret
3123aff11eSPengcheng Wang;
3223aff11eSPengcheng Wang; EXPENSIVE-LABEL: test2:
3323aff11eSPengcheng Wang; EXPENSIVE:       # %bb.0: # %entry
3423aff11eSPengcheng Wang; EXPENSIVE-NEXT:    sext.w a1, a0
3523aff11eSPengcheng Wang; EXPENSIVE-NEXT:    blez a1, .LBB1_2
3623aff11eSPengcheng Wang; EXPENSIVE-NEXT:  # %bb.1: # %select.false
3723aff11eSPengcheng Wang; EXPENSIVE-NEXT:    addiw a0, a0, -1
3823aff11eSPengcheng Wang; EXPENSIVE-NEXT:    ret
3923aff11eSPengcheng Wang; EXPENSIVE-NEXT:  .LBB1_2:
4023aff11eSPengcheng Wang; EXPENSIVE-NEXT:    li a0, 0
4123aff11eSPengcheng Wang; EXPENSIVE-NEXT:    ret
4223aff11eSPengcheng Wangentry:
4323aff11eSPengcheng Wang  %cmp = icmp slt i32 %a, 1
4423aff11eSPengcheng Wang  %dec = sub i32 %a, 1
4523aff11eSPengcheng Wang  %res = select i1 %cmp, i32 0, i32 %dec, !prof !1
4623aff11eSPengcheng Wang  ret i32 %res
4723aff11eSPengcheng Wang}
4823aff11eSPengcheng Wang
4923aff11eSPengcheng Wang!0 = !{!"branch_weights", i32 1, i32 1}
5023aff11eSPengcheng Wang!1 = !{!"branch_weights", i32 1, i32 1000}
51