113 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes2; RUN: opt -passes=ipsccp -S %s | FileCheck %s3;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 %zero46}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 %unknown55}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 %unknown66}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 %unknown75}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 %unknown84}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 void96;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 void105}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