xref: /llvm-project/llvm/test/Transforms/FunctionSpecialization/function-specialization3.ll (revision e15d72adac66790a78a51a3087b56b2bde6b778a)
1475ddca5SAlexandros Lamprineas; RUN: opt -passes="ipsccp<func-spec>" -S < %s | \
2c4a0969bSSjoerd Meijer; RUN:   FileCheck %s --check-prefixes=COMMON,DISABLED
39627bcdeSAlexandros Lamprineas; RUN: opt -passes="ipsccp<func-spec>" -force-specialization -S < %s | \
4c4a0969bSSjoerd Meijer; RUN:   FileCheck %s --check-prefixes=COMMON,FORCE
5c4a0969bSSjoerd Meijer
6c4a0969bSSjoerd Meijer; Test for specializing a constant global.
7c4a0969bSSjoerd Meijer
8c4a0969bSSjoerd Meijertarget datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
9c4a0969bSSjoerd Meijer
10c4a0969bSSjoerd Meijer@A = external dso_local constant i32, align 4
11c4a0969bSSjoerd Meijer@B = external dso_local constant i32, align 4
12c4a0969bSSjoerd Meijer
13c4a0969bSSjoerd Meijerdefine dso_local i32 @bar(i32 %x, i32 %y) {
14c4a0969bSSjoerd Meijer; COMMON-LABEL: @bar
15*e15d72adSAlexandros Lamprineas; FORCE:        %call = call i32 @foo.specialized.1(i32 %x, ptr @A)
16*e15d72adSAlexandros Lamprineas; FORCE:        %call1 = call i32 @foo.specialized.2(i32 %y, ptr @B)
17*e15d72adSAlexandros Lamprineas; DISABLED-NOT: %call1 = call i32 @foo.specialized.1(
18c4a0969bSSjoerd Meijerentry:
19c4a0969bSSjoerd Meijer  %tobool = icmp ne i32 %x, 0
20c4a0969bSSjoerd Meijer  br i1 %tobool, label %if.then, label %if.else
21c4a0969bSSjoerd Meijer
22c4a0969bSSjoerd Meijerif.then:
23ebdf5aefSMatt Arsenault  %call = call i32 @foo(i32 %x, ptr @A)
24c4a0969bSSjoerd Meijer  br label %return
25c4a0969bSSjoerd Meijer
26c4a0969bSSjoerd Meijerif.else:
27ebdf5aefSMatt Arsenault  %call1 = call i32 @foo(i32 %y, ptr @B)
28c4a0969bSSjoerd Meijer  br label %return
29c4a0969bSSjoerd Meijer
30c4a0969bSSjoerd Meijerreturn:
31c4a0969bSSjoerd Meijer  %retval.0 = phi i32 [ %call, %if.then ], [ %call1, %if.else ]
32c4a0969bSSjoerd Meijer  ret i32 %retval.0
33c4a0969bSSjoerd Meijer}
34c4a0969bSSjoerd Meijer
3533830326SAlexandros Lamprineas; FORCE-NOT: define internal i32 @foo(
3633830326SAlexandros Lamprineas;
37*e15d72adSAlexandros Lamprineas; FORCE:      define internal i32 @foo.specialized.1(i32 %x, ptr %b) {
38c4a0969bSSjoerd Meijer; FORCE-NEXT: entry:
39ebdf5aefSMatt Arsenault; FORCE-NEXT:   %0 = load i32, ptr @A, align 4
40c4a0969bSSjoerd Meijer; FORCE-NEXT:   %add = add nsw i32 %x, %0
41c4a0969bSSjoerd Meijer; FORCE-NEXT:   ret i32 %add
42c4a0969bSSjoerd Meijer; FORCE-NEXT: }
4333830326SAlexandros Lamprineas;
44*e15d72adSAlexandros Lamprineas; FORCE:      define internal i32 @foo.specialized.2(i32 %x, ptr %b) {
45c4a0969bSSjoerd Meijer; FORCE-NEXT: entry:
46ebdf5aefSMatt Arsenault; FORCE-NEXT:   %0 = load i32, ptr @B, align 4
47c4a0969bSSjoerd Meijer; FORCE-NEXT:   %add = add nsw i32 %x, %0
48c4a0969bSSjoerd Meijer; FORCE-NEXT:   ret i32 %add
49c4a0969bSSjoerd Meijer; FORCE-NEXT: }
5033830326SAlexandros Lamprineas;
51ebdf5aefSMatt Arsenaultdefine internal i32 @foo(i32 %x, ptr %b) {
52c4a0969bSSjoerd Meijerentry:
53ebdf5aefSMatt Arsenault  %0 = load i32, ptr %b, align 4
54c4a0969bSSjoerd Meijer  %add = add nsw i32 %x, %0
55c4a0969bSSjoerd Meijer  ret i32 %add
56c4a0969bSSjoerd Meijer}
57