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