xref: /llvm-project/llvm/test/Transforms/SCCP/multiple_callbacks.ll (revision 0991da36906bdb29b8f1030d5123bafb58fee79e)
1599955ebSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes
28ebb3eacSBjorn Pettersson; RUN: opt -passes=ipsccp -S %s | FileCheck %s
3599955ebSFlorian Hahn;
4599955ebSFlorian Hahn;
5599955ebSFlorian Hahn;                            /---------------------------------------|
6599955ebSFlorian Hahn;                            |                /----------------------|----|
7599955ebSFlorian Hahn;                            |                |                /-----|    |
8599955ebSFlorian Hahn;                            V                V                V     |    |
9599955ebSFlorian Hahn;    void broker(int (*cb0)(int), int (*cb1)(int), int (*cb2)(int), int, int);
10599955ebSFlorian Hahn;
11599955ebSFlorian Hahn;    static int cb0(int zero) {
12599955ebSFlorian Hahn;      return zero;
13599955ebSFlorian Hahn;    }
14599955ebSFlorian Hahn;    static int cb1(int unknown) {
15599955ebSFlorian Hahn;      return unknown;
16599955ebSFlorian Hahn;    }
17599955ebSFlorian Hahn;    static int cb2(int unknown) {
18599955ebSFlorian Hahn;      cb0(0);
19599955ebSFlorian Hahn;      return unknown;
20599955ebSFlorian Hahn;    }
21599955ebSFlorian Hahn;    static int cb3(int unknown) {
22599955ebSFlorian Hahn;      return unknown;
23599955ebSFlorian Hahn;    }
24599955ebSFlorian Hahn;    static int cb4(int unknown) {
25599955ebSFlorian Hahn;      return unknown;
26599955ebSFlorian Hahn;    }
27599955ebSFlorian Hahn;
28599955ebSFlorian Hahn;    void foo() {
29599955ebSFlorian Hahn;      cb0(0);
30599955ebSFlorian Hahn;      cb3(1);
31599955ebSFlorian Hahn;      broker(cb0, cb1, cb0, 0, 1);
32599955ebSFlorian Hahn;      broker(cb1, cb2, cb2, 0, 1);
33599955ebSFlorian Hahn;      broker(cb3, cb2, cb3, 0, 1);
34599955ebSFlorian Hahn;      broker(cb4, cb4, cb4, 0, 1);
35599955ebSFlorian Hahn;    }
36599955ebSFlorian Hahn;
37599955ebSFlorian Hahntarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
38599955ebSFlorian Hahn
39599955ebSFlorian Hahndefine internal i32 @cb0(i32 %zero) {
40599955ebSFlorian Hahn; CHECK-LABEL: @cb0(
41599955ebSFlorian Hahn; CHECK-NEXT:  entry:
42599955ebSFlorian Hahn; CHECK-NEXT:    ret i32 [[ZERO:%.*]]
43599955ebSFlorian Hahn;
44599955ebSFlorian Hahnentry:
45599955ebSFlorian Hahn  ret i32 %zero
46599955ebSFlorian Hahn}
47599955ebSFlorian Hahn
48599955ebSFlorian Hahndefine internal i32 @cb1(i32 %unknown) {
49599955ebSFlorian Hahn; CHECK-LABEL: @cb1(
50599955ebSFlorian Hahn; CHECK-NEXT:  entry:
51599955ebSFlorian Hahn; CHECK-NEXT:    ret i32 [[UNKNOWN:%.*]]
52599955ebSFlorian Hahn;
53599955ebSFlorian Hahnentry:
54599955ebSFlorian Hahn  ret i32 %unknown
55599955ebSFlorian Hahn}
56599955ebSFlorian Hahn
57599955ebSFlorian Hahndefine internal i32 @cb2(i32 %unknown) {
58599955ebSFlorian Hahn; CHECK-LABEL: @cb2(
59599955ebSFlorian Hahn; CHECK-NEXT:  entry:
60599955ebSFlorian Hahn; CHECK-NEXT:    [[CALL:%.*]] = call i32 @cb0(i32 0)
61599955ebSFlorian Hahn; CHECK-NEXT:    ret i32 [[UNKNOWN:%.*]]
62599955ebSFlorian Hahn;
63599955ebSFlorian Hahnentry:
64599955ebSFlorian Hahn  %call = call i32 @cb0(i32 0)
65599955ebSFlorian Hahn  ret i32 %unknown
66599955ebSFlorian Hahn}
67599955ebSFlorian Hahn
68599955ebSFlorian Hahndefine internal i32 @cb3(i32 %unknown) {
69599955ebSFlorian Hahn; CHECK-LABEL: @cb3(
70599955ebSFlorian Hahn; CHECK-NEXT:  entry:
71599955ebSFlorian Hahn; CHECK-NEXT:    ret i32 [[UNKNOWN:%.*]]
72599955ebSFlorian Hahn;
73599955ebSFlorian Hahnentry:
74599955ebSFlorian Hahn  ret i32 %unknown
75599955ebSFlorian Hahn}
76599955ebSFlorian Hahn
77599955ebSFlorian Hahndefine internal i32 @cb4(i32 %unknown) {
78599955ebSFlorian Hahn; CHECK-LABEL: @cb4(
79599955ebSFlorian Hahn; CHECK-NEXT:  entry:
80599955ebSFlorian Hahn; CHECK-NEXT:    ret i32 [[UNKNOWN:%.*]]
81599955ebSFlorian Hahn;
82599955ebSFlorian Hahnentry:
83599955ebSFlorian Hahn  ret i32 %unknown
84599955ebSFlorian Hahn}
85599955ebSFlorian Hahn
86599955ebSFlorian Hahndefine void @foo() {
87599955ebSFlorian Hahn; CHECK-LABEL: @foo(
88599955ebSFlorian Hahn; CHECK-NEXT:  entry:
89599955ebSFlorian Hahn; CHECK-NEXT:    [[CALL:%.*]] = call i32 @cb0(i32 0)
90599955ebSFlorian Hahn; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @cb3(i32 1)
91*0991da36SNikita Popov; CHECK-NEXT:    call void @broker(ptr nonnull @cb0, ptr nonnull @cb1, ptr nonnull @cb0, i32 0, i32 1)
92*0991da36SNikita Popov; CHECK-NEXT:    call void @broker(ptr nonnull @cb1, ptr nonnull @cb2, ptr nonnull @cb2, i32 0, i32 1)
93*0991da36SNikita Popov; CHECK-NEXT:    call void @broker(ptr nonnull @cb3, ptr nonnull @cb2, ptr nonnull @cb3, i32 0, i32 1)
94*0991da36SNikita Popov; CHECK-NEXT:    call void @broker(ptr nonnull @cb4, ptr nonnull @cb4, ptr nonnull @cb4, i32 0, i32 1)
95599955ebSFlorian Hahn; CHECK-NEXT:    ret void
96599955ebSFlorian Hahn;
97599955ebSFlorian Hahnentry:
98599955ebSFlorian Hahn  %call = call i32 @cb0(i32 0)
99599955ebSFlorian Hahn  %call1 = call i32 @cb3(i32 1)
100*0991da36SNikita Popov  call void @broker(ptr nonnull @cb0, ptr nonnull @cb1, ptr nonnull @cb0, i32 0, i32 1)
101*0991da36SNikita Popov  call void @broker(ptr nonnull @cb1, ptr nonnull @cb2, ptr nonnull @cb2, i32 0, i32 1)
102*0991da36SNikita Popov  call void @broker(ptr nonnull @cb3, ptr nonnull @cb2, ptr nonnull @cb3, i32 0, i32 1)
103*0991da36SNikita Popov  call void @broker(ptr nonnull @cb4, ptr nonnull @cb4, ptr nonnull @cb4, i32 0, i32 1)
104599955ebSFlorian Hahn  ret void
105599955ebSFlorian Hahn}
106599955ebSFlorian Hahn
107*0991da36SNikita Popovdeclare !callback !3 void @broker(ptr, ptr, ptr, i32, i32)
108599955ebSFlorian Hahn
109599955ebSFlorian Hahn!0 = !{i64 0, i64 3, i1 false}
110599955ebSFlorian Hahn!1 = !{i64 1, i64 4, i1 false}
111599955ebSFlorian Hahn!2 = !{i64 2, i64 3, i1 false}
112599955ebSFlorian Hahn!3 = !{!0, !2, !1}
113