[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / Transforms / IPConstantProp / multiple_callbacks.ll
blob3288b5b94de1120b3b068cbb25724f7bca99568c
1 ; RUN: opt -ipconstprop -S < %s | FileCheck %s
4 ;                            /---------------------------------------|
5 ;                            |                /----------------------|----|
6 ;                            |                |                /-----|    |
7 ;                            V                V                V     |    |
8 ;    void broker(int (*cb0)(int), int (*cb1)(int), int (*cb2)(int), int, int);
10 ;    static int cb0(int zero) {
11 ;      return zero;
12 ;    }
13 ;    static int cb1(int unknown) {
14 ;      return unknown;
15 ;    }
16 ;    static int cb2(int unknown) {
17 ;      cb0(0);
18 ;      return unknown;
19 ;    }
20 ;    static int cb3(int unknown) {
21 ;      return unknown;
22 ;    }
23 ;    static int cb4(int unknown) {
24 ;      return unknown;
25 ;    }
27 ;    void foo() {
28 ;      cb0(0);
29 ;      cb3(1);
30 ;      broker(cb0, cb1, cb0, 0, 1);
31 ;      broker(cb1, cb2, cb2, 0, 1);
32 ;      broker(cb3, cb2, cb3, 0, 1);
33 ;      broker(cb4, cb4, cb4, 0, 1);
34 ;    }
36 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
38 define internal i32 @cb0(i32 %zero) {
39 entry:
40 ; CHECK:      @cb0
41 ; CHECK-NEXT: entry
42 ; CHECK-NEXT: ret i32 0
43   ret i32 %zero
46 define internal i32 @cb1(i32 %unknown) {
47 entry:
48 ; CHECK: ret i32 %unknown
49   ret i32 %unknown
52 define internal i32 @cb2(i32 %unknown) {
53 entry:
54   %call = call i32 @cb0(i32 0)
55 ; CHECK: ret i32 %unknown
56   ret i32 %unknown
59 define internal i32 @cb3(i32 %unknown) {
60 entry:
61 ; CHECK: ret i32 %unknown
62   ret i32 %unknown
65 define internal i32 @cb4(i32 %unknown) {
66 entry:
67 ; CHECK: ret i32 %unknown
68   ret i32 %unknown
71 define void @foo() {
72 entry:
73   %call = call i32 @cb0(i32 0)
74   %call1 = call i32 @cb3(i32 1)
75   call void @broker(i32 (i32)* nonnull @cb0, i32 (i32)* nonnull @cb1, i32 (i32)* nonnull @cb0, i32 0, i32 1)
76   call void @broker(i32 (i32)* nonnull @cb1, i32 (i32)* nonnull @cb2, i32 (i32)* nonnull @cb2, i32 0, i32 1)
77   call void @broker(i32 (i32)* nonnull @cb3, i32 (i32)* nonnull @cb2, i32 (i32)* nonnull @cb3, i32 0, i32 1)
78   call void @broker(i32 (i32)* nonnull @cb4, i32 (i32)* nonnull @cb4, i32 (i32)* nonnull @cb4, i32 0, i32 1)
79   ret void
82 declare !callback !3 void @broker(i32 (i32)*, i32 (i32)*, i32 (i32)*, i32, i32)
84 !0 = !{i64 0, i64 3, i1 false}
85 !1 = !{i64 1, i64 4, i1 false}
86 !2 = !{i64 2, i64 3, i1 false}
87 !3 = !{!0, !2, !1}