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 3; 4; 5; /---------------------------------------| 6; | /----------------------|----| 7; | | /-----| | 8; V V V | | 9; void broker(int (*cb0)(int), int (*cb1)(int), int (*cb2)(int), int, int); 10; 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; } 27; 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; } 36; 37target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 38 39define internal i32 @cb0(i32 %zero) { 40; CHECK-LABEL: @cb0( 41; CHECK-NEXT: entry: 42; CHECK-NEXT: ret i32 [[ZERO:%.*]] 43; 44entry: 45 ret i32 %zero 46} 47 48define internal i32 @cb1(i32 %unknown) { 49; CHECK-LABEL: @cb1( 50; CHECK-NEXT: entry: 51; CHECK-NEXT: ret i32 [[UNKNOWN:%.*]] 52; 53entry: 54 ret i32 %unknown 55} 56 57define 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:%.*]] 62; 63entry: 64 %call = call i32 @cb0(i32 0) 65 ret i32 %unknown 66} 67 68define internal i32 @cb3(i32 %unknown) { 69; CHECK-LABEL: @cb3( 70; CHECK-NEXT: entry: 71; CHECK-NEXT: ret i32 [[UNKNOWN:%.*]] 72; 73entry: 74 ret i32 %unknown 75} 76 77define internal i32 @cb4(i32 %unknown) { 78; CHECK-LABEL: @cb4( 79; CHECK-NEXT: entry: 80; CHECK-NEXT: ret i32 [[UNKNOWN:%.*]] 81; 82entry: 83 ret i32 %unknown 84} 85 86define 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 96; 97entry: 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 105} 106 107declare !callback !3 void @broker(ptr, ptr, ptr, i32, i32) 108 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} 113