Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Transforms / SCCP / multiple_callbacks.ll
blob47c882985631fbf1922c0456b26fb29a308959fd
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes
2 ; RUN: opt -passes=ipsccp -S %s | FileCheck %s
5 ;                            /---------------------------------------|
6 ;                            |                /----------------------|----|
7 ;                            |                |                /-----|    |
8 ;                            V                V                V     |    |
9 ;    void broker(int (*cb0)(int), int (*cb1)(int), int (*cb2)(int), int, int);
11 ;    static int cb0(int zero) {
12 ;      return zero;
13 ;    }
14 ;    static int cb1(int unknown) {
15 ;      return unknown;
16 ;    }
17 ;    static int cb2(int unknown) {
18 ;      cb0(0);
19 ;      return unknown;
20 ;    }
21 ;    static int cb3(int unknown) {
22 ;      return unknown;
23 ;    }
24 ;    static int cb4(int unknown) {
25 ;      return unknown;
26 ;    }
28 ;    void foo() {
29 ;      cb0(0);
30 ;      cb3(1);
31 ;      broker(cb0, cb1, cb0, 0, 1);
32 ;      broker(cb1, cb2, cb2, 0, 1);
33 ;      broker(cb3, cb2, cb3, 0, 1);
34 ;      broker(cb4, cb4, cb4, 0, 1);
35 ;    }
37 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
39 define internal i32 @cb0(i32 %zero) {
40 ; CHECK-LABEL: @cb0(
41 ; CHECK-NEXT:  entry:
42 ; CHECK-NEXT:    ret i32 [[ZERO:%.*]]
44 entry:
45   ret i32 %zero
48 define internal i32 @cb1(i32 %unknown) {
49 ; CHECK-LABEL: @cb1(
50 ; CHECK-NEXT:  entry:
51 ; CHECK-NEXT:    ret i32 [[UNKNOWN:%.*]]
53 entry:
54   ret i32 %unknown
57 define internal i32 @cb2(i32 %unknown) {
58 ; CHECK-LABEL: @cb2(
59 ; CHECK-NEXT:  entry:
60 ; CHECK-NEXT:    [[CALL:%.*]] = call i32 @cb0(i32 0)
61 ; CHECK-NEXT:    ret i32 [[UNKNOWN:%.*]]
63 entry:
64   %call = call i32 @cb0(i32 0)
65   ret i32 %unknown
68 define internal i32 @cb3(i32 %unknown) {
69 ; CHECK-LABEL: @cb3(
70 ; CHECK-NEXT:  entry:
71 ; CHECK-NEXT:    ret i32 [[UNKNOWN:%.*]]
73 entry:
74   ret i32 %unknown
77 define internal i32 @cb4(i32 %unknown) {
78 ; CHECK-LABEL: @cb4(
79 ; CHECK-NEXT:  entry:
80 ; CHECK-NEXT:    ret i32 [[UNKNOWN:%.*]]
82 entry:
83   ret i32 %unknown
86 define void @foo() {
87 ; CHECK-LABEL: @foo(
88 ; CHECK-NEXT:  entry:
89 ; CHECK-NEXT:    [[CALL:%.*]] = call i32 @cb0(i32 0)
90 ; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @cb3(i32 1)
91 ; CHECK-NEXT:    call void @broker(ptr nonnull @cb0, ptr nonnull @cb1, ptr nonnull @cb0, i32 0, i32 1)
92 ; CHECK-NEXT:    call void @broker(ptr nonnull @cb1, ptr nonnull @cb2, ptr nonnull @cb2, i32 0, i32 1)
93 ; CHECK-NEXT:    call void @broker(ptr nonnull @cb3, ptr nonnull @cb2, ptr nonnull @cb3, i32 0, i32 1)
94 ; CHECK-NEXT:    call void @broker(ptr nonnull @cb4, ptr nonnull @cb4, ptr nonnull @cb4, i32 0, i32 1)
95 ; CHECK-NEXT:    ret void
97 entry:
98   %call = call i32 @cb0(i32 0)
99   %call1 = call i32 @cb3(i32 1)
100   call void @broker(ptr nonnull @cb0, ptr nonnull @cb1, ptr nonnull @cb0, i32 0, i32 1)
101   call void @broker(ptr nonnull @cb1, ptr nonnull @cb2, ptr nonnull @cb2, i32 0, i32 1)
102   call void @broker(ptr nonnull @cb3, ptr nonnull @cb2, ptr nonnull @cb3, i32 0, i32 1)
103   call void @broker(ptr nonnull @cb4, ptr nonnull @cb4, ptr nonnull @cb4, i32 0, i32 1)
104   ret void
107 declare !callback !3 void @broker(ptr, ptr, ptr, i32, i32)
109 !0 = !{i64 0, i64 3, i1 false}
110 !1 = !{i64 1, i64 4, i1 false}
111 !2 = !{i64 2, i64 3, i1 false}
112 !3 = !{!0, !2, !1}