xref: /llvm-project/llvm/test/Transforms/FunctionSpecialization/get-possible-constants.ll (revision 06664fdc7680f7f9fa9b0a414a8fb8df2f913d48)
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