1*06664fdcSHari Limaye; RUN: opt -S --passes="ipsccp<func-spec>" -funcspec-for-literal-constant=false < %s | FileCheck %s 21a525decSMomchil Velikovdefine dso_local i32 @p0(i32 noundef %x) { 31a525decSMomchil Velikoventry: 41a525decSMomchil Velikov %add = add nsw i32 %x, 1 51a525decSMomchil Velikov ret i32 %add 61a525decSMomchil Velikov} 71a525decSMomchil Velikov 81a525decSMomchil Velikovdefine dso_local i32 @p1(i32 noundef %x) { 91a525decSMomchil Velikoventry: 101a525decSMomchil Velikov %sub = add nsw i32 %x, -1 111a525decSMomchil Velikov ret i32 %sub 121a525decSMomchil Velikov} 131a525decSMomchil Velikov 148136a017SAlexandros Lamprineas; CHECK-LABEL: define dso_local i32 @f0 15e15d72adSAlexandros Lamprineas; CHECK: tail call fastcc i32 @g.specialized.[[#A:]]({{.*}}@p0) 168136a017SAlexandros Lamprineas; 178136a017SAlexandros Lamprineasdefine dso_local i32 @f0(i32 noundef %x) { 188136a017SAlexandros Lamprineasentry: 198136a017SAlexandros Lamprineas %call = tail call fastcc i32 @g(i32 noundef %x, ptr noundef nonnull @p0) 208136a017SAlexandros Lamprineas ret i32 %call 218136a017SAlexandros Lamprineas} 228136a017SAlexandros Lamprineas 238136a017SAlexandros Lamprineas; CHECK-LABEL: define dso_local i32 @f1 24e15d72adSAlexandros Lamprineas; CHECK: tail call fastcc i32 @g.specialized.[[#B:]]({{.*}}@p1) 258136a017SAlexandros Lamprineas; 268136a017SAlexandros Lamprineasdefine dso_local i32 @f1(i32 noundef %x) { 278136a017SAlexandros Lamprineasentry: 288136a017SAlexandros Lamprineas %call = tail call fastcc i32 @g(i32 noundef %x, ptr noundef nonnull @p1) 298136a017SAlexandros Lamprineas ret i32 %call 308136a017SAlexandros Lamprineas} 318136a017SAlexandros Lamprineas 328136a017SAlexandros Lamprineas; @g gets fully specialized 338136a017SAlexandros Lamprineas; CHECK-NOT: define internal fastcc i32 @g( 348136a017SAlexandros Lamprineas 358136a017SAlexandros Lamprineasdefine internal fastcc i32 @g(i32 noundef %x, ptr nocapture noundef readonly %p) noinline { 368136a017SAlexandros Lamprineasentry: 378136a017SAlexandros Lamprineas %pcall = tail call i32 %p(i32 noundef %x) 388136a017SAlexandros Lamprineas %fcall = tail call fastcc i32 @f(i32 noundef %pcall, ptr noundef nonnull %p) 398136a017SAlexandros Lamprineas ret i32 %fcall 408136a017SAlexandros Lamprineas} 418136a017SAlexandros Lamprineas 428136a017SAlexandros Lamprineas; CHECK-LABEL: define dso_local i32 @g0 43e15d72adSAlexandros Lamprineas; CHECK: tail call fastcc i32 @f.specialized.[[#C:]]({{.*}}@p0) 448136a017SAlexandros Lamprineas; 451a525decSMomchil Velikovdefine dso_local i32 @g0(i32 noundef %x) { 461a525decSMomchil Velikoventry: 471a525decSMomchil Velikov %call = tail call fastcc i32 @f(i32 noundef %x, ptr noundef nonnull @p0) 481a525decSMomchil Velikov ret i32 %call 491a525decSMomchil Velikov} 501a525decSMomchil Velikov 511a525decSMomchil Velikovdefine internal fastcc i32 @f(i32 noundef %x, ptr nocapture noundef readonly %p) noinline { 521a525decSMomchil Velikoventry: 531a525decSMomchil Velikov %call = tail call i32 %p(i32 noundef %x) 541a525decSMomchil Velikov %add = add nsw i32 %call, %x 551a525decSMomchil Velikov ret i32 %add 561a525decSMomchil Velikov} 571a525decSMomchil Velikov 588136a017SAlexandros Lamprineas; CHECK-LABEL: define dso_local i32 @g1 59e15d72adSAlexandros Lamprineas; CHECK: tail call fastcc i32 @f.specialized.[[#D:]]({{.*}}@p1) 608136a017SAlexandros Lamprineas; 611a525decSMomchil Velikovdefine dso_local i32 @g1(i32 noundef %x) { 621a525decSMomchil Velikoventry: 631a525decSMomchil Velikov %call = tail call fastcc i32 @f(i32 noundef %x, ptr noundef nonnull @p1) 641a525decSMomchil Velikov ret i32 %call 651a525decSMomchil Velikov} 661a525decSMomchil Velikov 671a525decSMomchil Velikovdefine dso_local i32 @g2(i32 noundef %x) { 681a525decSMomchil Velikoventry: 691a525decSMomchil Velikov %call = tail call fastcc i32 @f(i32 noundef %x, ptr poison) 701a525decSMomchil Velikov ret i32 %call 711a525decSMomchil Velikov} 721a525decSMomchil Velikov 731a525decSMomchil Velikov; Check that a single argument, that cannot be used for specialisation, does not 741a525decSMomchil Velikov; prevent specialisation based on other arguments. 758136a017SAlexandros Lamprineas; 768136a017SAlexandros Lamprineas; Also check that for callsites which reside in the body of newly created 778136a017SAlexandros Lamprineas; (specialized) functions, the lattice value of the arguments is known. 788136a017SAlexandros Lamprineas; 79e15d72adSAlexandros Lamprineas; CHECK-DAG: define internal fastcc i32 @g.specialized.[[#A]] 80e15d72adSAlexandros Lamprineas; CHECK-DAG: define internal fastcc i32 @g.specialized.[[#B]] 81e15d72adSAlexandros Lamprineas; CHECK-DAG: define internal fastcc i32 @f.specialized.[[#C]] 82e15d72adSAlexandros Lamprineas; CHECK-DAG: define internal fastcc i32 @f.specialized.[[#D]] 83