1*33830326SAlexandros Lamprineas; RUN: opt -function-specialization -func-specialization-size-threshold=3 -S < %s | FileCheck %s 2*33830326SAlexandros Lamprineas 3*33830326SAlexandros Lamprineasdefine i64 @main(i64 %x, i1 %flag) { 4*33830326SAlexandros Lamprineasentry: 5*33830326SAlexandros Lamprineas br i1 %flag, label %plus, label %minus 6*33830326SAlexandros Lamprineas 7*33830326SAlexandros Lamprineasplus: 8*33830326SAlexandros Lamprineas %tmp0 = call i64 @compute(i64 %x, i64 (i64)* @plus) 9*33830326SAlexandros Lamprineas br label %merge 10*33830326SAlexandros Lamprineas 11*33830326SAlexandros Lamprineasminus: 12*33830326SAlexandros Lamprineas %tmp1 = call i64 @compute(i64 %x, i64 (i64)* @minus) 13*33830326SAlexandros Lamprineas br label %merge 14*33830326SAlexandros Lamprineas 15*33830326SAlexandros Lamprineasmerge: 16*33830326SAlexandros Lamprineas %tmp2 = phi i64 [ %tmp0, %plus ], [ %tmp1, %minus] 17*33830326SAlexandros Lamprineas ret i64 %tmp2 18*33830326SAlexandros Lamprineas} 19*33830326SAlexandros Lamprineas 20*33830326SAlexandros Lamprineas; CHECK-NOT: define internal i64 @compute( 21*33830326SAlexandros Lamprineas; 22*33830326SAlexandros Lamprineas; CHECK-LABEL: define internal i64 @compute.1(i64 %n, i64 (i64)* %binop) { 23*33830326SAlexandros Lamprineas; CHECK: [[TMP0:%.+]] = call i64 @plus(i64 %n) 24*33830326SAlexandros Lamprineas; CHECK: [[TMP1:%.+]] = call i64 @compute.1(i64 [[TMP2:%.+]], i64 (i64)* @plus) 25*33830326SAlexandros Lamprineas; CHECK: add nsw i64 [[TMP1]], [[TMP0]] 26*33830326SAlexandros Lamprineas; 27*33830326SAlexandros Lamprineas; CHECK-LABEL: define internal i64 @compute.2(i64 %n, i64 (i64)* %binop) { 28*33830326SAlexandros Lamprineas; CHECK: [[TMP0:%.+]] = call i64 @minus(i64 %n) 29*33830326SAlexandros Lamprineas; CHECK: [[TMP1:%.+]] = call i64 @compute.2(i64 [[TMP2:%.+]], i64 (i64)* @minus) 30*33830326SAlexandros Lamprineas; CHECK: add nsw i64 [[TMP1]], [[TMP0]] 31*33830326SAlexandros Lamprineas; 32*33830326SAlexandros Lamprineasdefine internal i64 @compute(i64 %n, i64 (i64)* %binop) { 33*33830326SAlexandros Lamprineasentry: 34*33830326SAlexandros Lamprineas %cmp = icmp sgt i64 %n, 0 35*33830326SAlexandros Lamprineas br i1 %cmp, label %if.then, label %if.end 36*33830326SAlexandros Lamprineas 37*33830326SAlexandros Lamprineasif.then: 38*33830326SAlexandros Lamprineas %call = call i64 %binop(i64 %n) 39*33830326SAlexandros Lamprineas %sub = add nsw i64 %n, -1 40*33830326SAlexandros Lamprineas %call1 = call i64 @compute(i64 %sub, i64 (i64)* %binop) 41*33830326SAlexandros Lamprineas %add2 = add nsw i64 %call1, %call 42*33830326SAlexandros Lamprineas br label %if.end 43*33830326SAlexandros Lamprineas 44*33830326SAlexandros Lamprineasif.end: 45*33830326SAlexandros Lamprineas %result.0 = phi i64 [ %add2, %if.then ], [ 0, %entry ] 46*33830326SAlexandros Lamprineas ret i64 %result.0 47*33830326SAlexandros Lamprineas} 48*33830326SAlexandros Lamprineas 49*33830326SAlexandros Lamprineasdefine internal i64 @plus(i64 %x) { 50*33830326SAlexandros Lamprineasentry: 51*33830326SAlexandros Lamprineas %tmp0 = add i64 %x, 1 52*33830326SAlexandros Lamprineas ret i64 %tmp0 53*33830326SAlexandros Lamprineas} 54*33830326SAlexandros Lamprineas 55*33830326SAlexandros Lamprineasdefine internal i64 @minus(i64 %x) { 56*33830326SAlexandros Lamprineasentry: 57*33830326SAlexandros Lamprineas %tmp0 = sub i64 %x, 1 58*33830326SAlexandros Lamprineas ret i64 %tmp0 59*33830326SAlexandros Lamprineas} 60