1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -always-inline < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare void @f() 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @g() 5*9880d681SAndroid Build Coastguard Workerdeclare fastcc i32 @g.fastcc() 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine i32 @callee_0() alwaysinline { 8*9880d681SAndroid Build Coastguard Worker entry: 9*9880d681SAndroid Build Coastguard Worker call void @f() 10*9880d681SAndroid Build Coastguard Worker ret i32 2 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine i32 @caller_0() { 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_0( 15*9880d681SAndroid Build Coastguard Worker entry: 16*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @f() 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 2 19*9880d681SAndroid Build Coastguard Worker %x = call i32 @callee_0() [ "deopt"(i32 5) ] 20*9880d681SAndroid Build Coastguard Worker ret i32 %x 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine i32 @callee_1() alwaysinline { 24*9880d681SAndroid Build Coastguard Worker entry: 25*9880d681SAndroid Build Coastguard Worker call void @f() [ "deopt"() ] 26*9880d681SAndroid Build Coastguard Worker call void @f() [ "deopt"(i32 0, i32 1) ] 27*9880d681SAndroid Build Coastguard Worker call void @f() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ] 28*9880d681SAndroid Build Coastguard Worker ret i32 2 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine i32 @caller_1() { 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_1( 33*9880d681SAndroid Build Coastguard Worker entry: 34*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @f() [ "deopt"(i32 5) ] 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @f() [ "deopt"(i32 5, i32 0, i32 1) ] 37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @f() [ "deopt"(i32 5, i32 0, i32 1), "foo"(double 0.000000e+00) ] 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 2 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker %x = call i32 @callee_1() [ "deopt"(i32 5) ] 41*9880d681SAndroid Build Coastguard Worker ret i32 %x 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine i32 @callee_2() alwaysinline { 45*9880d681SAndroid Build Coastguard Worker entry: 46*9880d681SAndroid Build Coastguard Worker %v = call i32 @g() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ] 47*9880d681SAndroid Build Coastguard Worker ret i32 %v 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine i32 @caller_2(i32 %val) { 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_2( 52*9880d681SAndroid Build Coastguard Worker entry: 53*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RVAL:%[^ ]+]] = call i32 @g() [ "deopt"(i32 %val, i32 0, i32 1), "foo"(double 0.000000e+00) ] 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[RVAL]] 56*9880d681SAndroid Build Coastguard Worker %x = call i32 @callee_2() [ "deopt"(i32 %val) ] 57*9880d681SAndroid Build Coastguard Worker ret i32 %x 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerdefine i32 @callee_3() alwaysinline { 61*9880d681SAndroid Build Coastguard Worker entry: 62*9880d681SAndroid Build Coastguard Worker %v = call i32 @g() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ] 63*9880d681SAndroid Build Coastguard Worker ret i32 %v 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerdefine i32 @caller_3() personality i8 3 { 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_3( 68*9880d681SAndroid Build Coastguard Worker entry: 69*9880d681SAndroid Build Coastguard Worker %x = invoke i32 @callee_3() [ "deopt"(i32 7) ] to label %normal unwind label %unwind 70*9880d681SAndroid Build Coastguard Worker; CHECK: invoke i32 @g() [ "deopt"(i32 7, i32 0, i32 1), "foo"(double 0.000000e+00) ] 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker normal: 73*9880d681SAndroid Build Coastguard Worker ret i32 %x 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker unwind: 76*9880d681SAndroid Build Coastguard Worker %cleanup = landingpad i8 cleanup 77*9880d681SAndroid Build Coastguard Worker ret i32 101 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine i32 @callee_4() alwaysinline personality i8 3 { 81*9880d681SAndroid Build Coastguard Worker entry: 82*9880d681SAndroid Build Coastguard Worker %v = invoke i32 @g() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ] to label %normal unwind label %unwind 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker normal: 85*9880d681SAndroid Build Coastguard Worker ret i32 %v 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker unwind: 88*9880d681SAndroid Build Coastguard Worker %cleanup = landingpad i8 cleanup 89*9880d681SAndroid Build Coastguard Worker ret i32 100 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdefine i32 @caller_4() { 93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_4( 94*9880d681SAndroid Build Coastguard Worker entry: 95*9880d681SAndroid Build Coastguard Worker; CHECK: invoke i32 @g() [ "deopt"(i32 7, i32 0, i32 1), "foo"(double 0.000000e+00) ] 96*9880d681SAndroid Build Coastguard Worker %x = call i32 @callee_4() [ "deopt"(i32 7) ] 97*9880d681SAndroid Build Coastguard Worker ret i32 %x 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerdefine i32 @callee_5() alwaysinline personality i8 3 { 101*9880d681SAndroid Build Coastguard Worker entry: 102*9880d681SAndroid Build Coastguard Worker %v = invoke fastcc i32 @g.fastcc() #0 [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ] to label %normal unwind label %unwind 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker normal: 105*9880d681SAndroid Build Coastguard Worker ret i32 %v 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker unwind: 108*9880d681SAndroid Build Coastguard Worker %cleanup = landingpad i8 cleanup 109*9880d681SAndroid Build Coastguard Worker ret i32 100 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerdefine i32 @caller_5() { 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_5( 114*9880d681SAndroid Build Coastguard Worker entry: 115*9880d681SAndroid Build Coastguard Worker; CHECK: invoke fastcc i32 @g.fastcc() #[[FOO_BAR_ATTR_IDX:[0-9]+]] [ "deopt"(i32 7, i32 0, i32 1), "foo"(double 0.000000e+00) ] 116*9880d681SAndroid Build Coastguard Worker %x = call i32 @callee_5() [ "deopt"(i32 7) ] 117*9880d681SAndroid Build Coastguard Worker ret i32 %x 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerdefine i32 @callee_6() alwaysinline personality i8 3 { 121*9880d681SAndroid Build Coastguard Worker entry: 122*9880d681SAndroid Build Coastguard Worker %v = call fastcc i32 @g.fastcc() #0 [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ] 123*9880d681SAndroid Build Coastguard Worker ret i32 %v 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine i32 @caller_6() { 127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_6( 128*9880d681SAndroid Build Coastguard Worker entry: 129*9880d681SAndroid Build Coastguard Worker; CHECK: call fastcc i32 @g.fastcc() #[[FOO_BAR_ATTR_IDX]] [ "deopt"(i32 7, i32 0, i32 1), "foo"(double 0.000000e+00) ] 130*9880d681SAndroid Build Coastguard Worker %x = call i32 @callee_6() [ "deopt"(i32 7) ] 131*9880d681SAndroid Build Coastguard Worker ret i32 %x 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine i32 @callee_7(i1 %val) alwaysinline personality i8 3 { 135*9880d681SAndroid Build Coastguard Worker; We want something that PruningFunctionCloner is not smart enough to 136*9880d681SAndroid Build Coastguard Worker; recognize, but can be recognized by recursivelySimplifyInstruction. 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker entry: 139*9880d681SAndroid Build Coastguard Worker br i1 %val, label %check, label %precheck 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker precheck: 142*9880d681SAndroid Build Coastguard Worker br label %check 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker check: 145*9880d681SAndroid Build Coastguard Worker %p = phi i1 [ %val, %entry ], [ true, %precheck ] 146*9880d681SAndroid Build Coastguard Worker br i1 %p, label %do.not, label %do 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker do.not: 149*9880d681SAndroid Build Coastguard Worker ret i32 0 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker do: 152*9880d681SAndroid Build Coastguard Worker %v = call fastcc i32 @g.fastcc() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ] 153*9880d681SAndroid Build Coastguard Worker ret i32 %v 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerdefine i32 @caller_7() { 157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_7( 158*9880d681SAndroid Build Coastguard Worker entry: 159*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call fastcc i32 @g.fastcc() 160*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 161*9880d681SAndroid Build Coastguard Worker %x = call i32 @callee_7(i1 true) [ "deopt"(i32 7) ] 162*9880d681SAndroid Build Coastguard Worker ret i32 %x 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerdefine i32 @callee_8(i1 %val) alwaysinline personality i8 3 { 166*9880d681SAndroid Build Coastguard Worker; We want something that PruningFunctionCloner is not smart enough to 167*9880d681SAndroid Build Coastguard Worker; recognize, but can be recognized by recursivelySimplifyInstruction. 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker entry: 170*9880d681SAndroid Build Coastguard Worker br i1 %val, label %check, label %precheck 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker precheck: 173*9880d681SAndroid Build Coastguard Worker br label %check 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker check: 176*9880d681SAndroid Build Coastguard Worker %p = phi i1 [ %val, %entry ], [ true, %precheck ] 177*9880d681SAndroid Build Coastguard Worker br i1 %p, label %do.not, label %do 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker do.not: 180*9880d681SAndroid Build Coastguard Worker ret i32 0 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker do: 183*9880d681SAndroid Build Coastguard Worker %phi = phi i32 [ 0, %check ], [ %v, %do ] 184*9880d681SAndroid Build Coastguard Worker %v = call fastcc i32 @g.fastcc() [ "deopt"(i32 0, i32 1), "foo"(double 0.0) ] 185*9880d681SAndroid Build Coastguard Worker %ic = icmp eq i32 %v, 42 186*9880d681SAndroid Build Coastguard Worker br i1 %ic, label %do, label %done 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker done: 189*9880d681SAndroid Build Coastguard Worker ret i32 %phi 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerdefine i32 @caller_8() { 193*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_8( 194*9880d681SAndroid Build Coastguard Worker entry: 195*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call fastcc i32 @g.fastcc() 196*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0 197*9880d681SAndroid Build Coastguard Worker %x = call i32 @callee_8(i1 true) [ "deopt"(i32 7) ] 198*9880d681SAndroid Build Coastguard Worker ret i32 %x 199*9880d681SAndroid Build Coastguard Worker} 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Workerattributes #0 = { "foo"="bar" } 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker; CHECK: attributes #[[FOO_BAR_ATTR_IDX]] = { "foo"="bar" } 204