[llvm] [SPARC] Mark branches as being expensive in early Niagara CPUs (PR #166489)
Sergei Barannikov via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 5 08:30:10 PST 2025
================
@@ -0,0 +1,42 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -O3 < %s -relocation-model=pic -mtriple=sparc -mcpu=v9 | FileCheck --check-prefix=SPARC %s
+; RUN: llc -O3 < %s -relocation-model=pic -mtriple=sparcv9 | FileCheck --check-prefix=SPARC64 %s
+
+;; Early Niagara processors should prefer conditional moves over branches
+;; even when it's predictable.
+
+define i32 @cdiv(i32 %cond, i32 %num) #0 {
+; SPARC-LABEL: cdiv:
+; SPARC: ! %bb.0: ! %entry
+; SPARC-NEXT: sethi 1398101, %o2
+; SPARC-NEXT: or %o2, 342, %o2
+; SPARC-NEXT: smul %o1, %o2, %o2
+; SPARC-NEXT: rd %y, %o2
+; SPARC-NEXT: srl %o2, 31, %o3
+; SPARC-NEXT: add %o2, %o3, %o2
+; SPARC-NEXT: cmp %o0, 0
+; SPARC-NEXT: move %icc, %o2, %o1
+; SPARC-NEXT: retl
+; SPARC-NEXT: mov %o1, %o0
+;
+; SPARC64-LABEL: cdiv:
+; SPARC64: ! %bb.0: ! %entry
+; SPARC64-NEXT: sra %o1, 0, %o2
+; SPARC64-NEXT: sethi 1398101, %o3
+; SPARC64-NEXT: or %o3, 342, %o3
+; SPARC64-NEXT: mulx %o2, %o3, %o2
+; SPARC64-NEXT: srlx %o2, 63, %o3
+; SPARC64-NEXT: srlx %o2, 32, %o2
+; SPARC64-NEXT: add %o2, %o3, %o2
+; SPARC64-NEXT: cmp %o0, 0
+; SPARC64-NEXT: move %icc, %o2, %o1
+; SPARC64-NEXT: retl
+; SPARC64-NEXT: mov %o1, %o0
+entry:
+ %div = sdiv i32 %num, 3
+ %cmp = icmp eq i32 %cond, 0
+ %ret = select i1 %cmp, i32 %div, i32 %num
+ ret i32 %ret
+}
+
+attributes #0 = { nounwind "tune-cpu"="niagara" }
----------------
s-barannikov wrote:
(nit) Can the two tests be combined into one with two RUN lines, one of which passing `-mattr=+no-predictor`?
https://github.com/llvm/llvm-project/pull/166489
More information about the llvm-commits
mailing list