[llvm] [GlobalOpt][FMV] Fix static resolution of calls. (PR #160011)

Alexandros Lamprineas via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 22 07:27:33 PDT 2025


================
@@ -340,14 +433,164 @@ entry:
 
 define i32 @caller7.default() #0 {
 ; CHECK-LABEL: define i32 @caller7.default(
-; CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] {
+; CHECK-SAME: ) #[[ATTR0]] {
 ; CHECK:    [[CALL:%.*]] = tail call i32 @test_alternative_names.default()
 ;
 entry:
   %call = tail call i32 @test_alternative_names()
   ret i32 %call
 }
 
+define weak_odr ptr @caller7.resolver() comdat {
+; CHECK-LABEL: define weak_odr ptr @caller7.resolver() comdat {
+resolver_entry:
+  tail call void @__init_cpu_features_resolver()
+  %0 = load i64, ptr @__aarch64_cpu_features, align 8
+  %1 = and i64 %0, 17563904
+  %2 = icmp eq i64 %1, 17563904
+  br i1 %2, label %common.ret, label %resolver_else
+
+common.ret:                                       ; preds = %resolver_else2, %resolver_else, %resolver_entry
+  %common.ret.op = phi ptr [ @caller7._Mdpb2Mfrintts, %resolver_entry ], [ @caller7._Mfrintts, %resolver_else ], [ %caller7._Mrcpc2.caller7.default, %resolver_else2 ]
+  ret ptr %common.ret.op
+
+resolver_else:                                    ; preds = %resolver_entry
+  %3 = and i64 %0, 16777472
+  %4 = icmp eq i64 %3, 16777472
+  br i1 %4, label %common.ret, label %resolver_else2
+
+resolver_else2:                                   ; preds = %resolver_else
+  %5 = and i64 %0, 12582912
+  %6 = icmp eq i64 %5, 12582912
+  %caller7._Mrcpc2.caller7.default = select i1 %6, ptr @caller7._Mrcpc2, ptr @caller7.default
+  br label %common.ret
+}
+
+declare i32 @test_unrelated_callers._Mmops() #3
+declare i32 @test_unrelated_callers._Msve2() #2
+declare i32 @test_unrelated_callers._Msve() #1
+declare i32 @test_unrelated_callers.default() #0
+
+define weak_odr ptr @test_unrelated_callers.resolver() comdat {
+; CHECK-LABEL: define weak_odr ptr @test_unrelated_callers.resolver() comdat {
+resolver_entry:
+  tail call void @__init_cpu_features_resolver()
+  %0 = load i64, ptr @__aarch64_cpu_features, align 8
+  %1 = and i64 %0, 576460752303423488
+  %.not = icmp eq i64 %1, 0
+  br i1 %.not, label %resolver_else, label %common.ret
+
+common.ret:                                       ; preds = %resolver_else2, %resolver_else, %resolver_entry
+  %common.ret.op = phi ptr [ @test_unrelated_callers._Mmops, %resolver_entry ], [ @test_unrelated_callers._Msve2, %resolver_else ], [ %test_unrelated_callers._Msve.test_unrelated_callers.default, %resolver_else2 ]
+  ret ptr %common.ret.op
+
+resolver_else:                                    ; preds = %resolver_entry
+  %2 = and i64 %0, 69793284352
+  %3 = icmp eq i64 %2, 69793284352
+  br i1 %3, label %common.ret, label %resolver_else2
+
+resolver_else2:                                   ; preds = %resolver_else
+  %4 = and i64 %0, 1073807616
+  %5 = icmp eq i64 %4, 1073807616
+  %test_unrelated_callers._Msve.test_unrelated_callers.default = select i1 %5, ptr @test_unrelated_callers._Msve, ptr @test_unrelated_callers.default
+  br label %common.ret
+}
+
+define i32 @caller8._MmopsMsve2() #4 {
+; CHECK-LABEL: define i32 @caller8._MmopsMsve2(
+; CHECK-SAME: ) #[[ATTR4]] {
+; CHECK:    [[CALL:%.*]] = tail call i32 @test_unrelated_callers._Mmops()
+;
+entry:
+  %call = tail call i32 @test_unrelated_callers()
+  ret i32 %call
+}
+
+define dso_local i32 @caller8._Msve2() #2 {
+; CHECK-LABEL: define dso_local i32 @caller8._Msve2(
+; CHECK-SAME: ) #[[ATTR2]] {
+; CHECK:    [[CALL:%.*]] = tail call i32 @test_unrelated_callers()
----------------
labrinea wrote:

It is suboptimal that the current algorithm cannot infer that `mops` is unavailable since the immediately higher priority caller version was `mops+sve2` and this one is `sve2`. If it could infer this, then the call would be redirected to `test_unrelated_callers._Msve2`.

https://github.com/llvm/llvm-project/pull/160011


More information about the llvm-commits mailing list