[llvm] [MergeFuncs] Don't introduce calls to {linkonce,weak}_odr functions. (PR #125050)
Kyungwoo Lee via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 30 09:51:52 PST 2025
================
@@ -0,0 +1,112 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs --version 5
+; RUN: opt -p mergefunc -S %s | FileCheck %s
+
+define linkonce_odr hidden void @linkonce_odr_caller_of_foo_1(ptr %p) {
+entry:
+ tail call void @foo(ptr %p)
+ tail call void @foo(ptr %p)
+ tail call void @foo(ptr %p)
+ ret void
+}
+
+define linkonce_odr hidden void @linkonce_odr_caller_of_foo_2(ptr %p) {
+entry:
+ tail call void @foo(ptr %p)
+ tail call void @foo(ptr %p)
+ tail call void @foo(ptr %p)
+ ret void
+}
+
+declare void @foo(ptr)
+
+define hidden void @linkonce_odr_caller_of_bar_1(ptr %p) {
+entry:
+ tail call void @bar(ptr %p)
+ tail call void @bar(ptr %p)
+ tail call void @bar(ptr %p)
+ ret void
+}
+
+define linkonce_odr hidden void @non_linkonce_caller_of_bar_2(ptr %p) {
+entry:
+ tail call void @bar(ptr %p)
+ tail call void @bar(ptr %p)
+ tail call void @bar(ptr %p)
+ ret void
+}
+
+declare void @bar(ptr)
+
+define hidden void @non_linkonce_caller_of_zar_1(ptr %p) {
+entry:
+ tail call void @zar(ptr %p)
+ tail call void @zar(ptr %p)
+ tail call void @zar(ptr %p)
+ ret void
+}
+
+define linkonce_odr hidden void @linkonce_odr_caller_of_zar_2(ptr %p) {
+entry:
+ tail call void @zar(ptr %p)
+ tail call void @zar(ptr %p)
+ tail call void @zar(ptr %p)
+ ret void
+}
+
+declare void @zar(ptr)
+; CHECK-LABEL: define private void @0(
+; CHECK-SAME: ptr [[P:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: tail call void @foo(ptr [[P]])
+; CHECK-NEXT: tail call void @foo(ptr [[P]])
+; CHECK-NEXT: tail call void @foo(ptr [[P]])
+; CHECK-NEXT: ret void
+;
+;
+; CHECK-LABEL: define private void @1(
+; CHECK-SAME: ptr [[P:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: tail call void @bar(ptr [[P]])
+; CHECK-NEXT: tail call void @bar(ptr [[P]])
+; CHECK-NEXT: tail call void @bar(ptr [[P]])
+; CHECK-NEXT: ret void
+;
+;
+; CHECK-LABEL: define linkonce_odr hidden void @linkonce_odr_caller_of_zar_2(
+; CHECK-SAME: ptr [[P:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: tail call void @zar(ptr [[P]])
+; CHECK-NEXT: tail call void @zar(ptr [[P]])
+; CHECK-NEXT: tail call void @zar(ptr [[P]])
+; CHECK-NEXT: ret void
+;
+;
+; CHECK-LABEL: define linkonce_odr hidden void @linkonce_odr_caller_of_foo_2(
+; CHECK-SAME: ptr [[TMP0:%.*]]) {
+; CHECK-NEXT: tail call void @[[GLOB0:[0-9]+]](ptr [[TMP0]])
+; CHECK-NEXT: ret void
+;
+;
+; CHECK-LABEL: define linkonce_odr hidden void @linkonce_odr_caller_of_foo_1(
+; CHECK-SAME: ptr [[TMP0:%.*]]) {
+; CHECK-NEXT: tail call void @[[GLOB0]](ptr [[TMP0]])
+; CHECK-NEXT: ret void
+;
+;
+; CHECK-LABEL: define linkonce_odr hidden void @non_linkonce_caller_of_bar_2(
+; CHECK-SAME: ptr [[TMP0:%.*]]) {
+; CHECK-NEXT: tail call void @[[GLOB1:[0-9]+]](ptr [[TMP0]])
+; CHECK-NEXT: ret void
+;
+;
+; CHECK-LABEL: define hidden void @linkonce_odr_caller_of_bar_1(
+; CHECK-SAME: ptr [[TMP0:%.*]]) {
+; CHECK-NEXT: tail call void @[[GLOB1]](ptr [[TMP0]])
+; CHECK-NEXT: ret void
+;
+;
+; CHECK-LABEL: define hidden void @non_linkonce_caller_of_zar_1(
----------------
kyulee-com wrote:
`*caller_of_bar*` and `*caller_of_zar*` have identical structures except for their order in the source, but their generated code differs. Can we ensure deterministic code generation regardless of their order?
https://github.com/llvm/llvm-project/pull/125050
More information about the llvm-commits
mailing list