xref: /llvm-project/llvm/test/Transforms/FunctionSpecialization/global-var-constants.ll (revision 93de97d750548cd90c53efd4367dbd0367aa30fd)
1de24d084SMomchil Velikov; RUN:  opt -S --passes=ipsccp,deadargelim --force-specialization                       < %s | FileCheck %s --check-prefix=NO-GLOBALS
2de24d084SMomchil Velikov; RUN:  opt -S --passes=ipsccp,deadargelim --force-specialization --funcspec-on-address < %s | FileCheck %s --check-prefix=GLOBALS
3de24d084SMomchil Velikov@G = global [10 x i32] zeroinitializer, align 4
4de24d084SMomchil Velikov
5de24d084SMomchil Velikovdefine internal i32 @f(ptr %p) noinline {
6de24d084SMomchil Velikoventry:
7de24d084SMomchil Velikov  %0 = load i32, ptr %p, align 4
8de24d084SMomchil Velikov  store i32 0, ptr %p, align 4
9de24d084SMomchil Velikov  ret i32 %0
10de24d084SMomchil Velikov}
11de24d084SMomchil Velikov
12de24d084SMomchil Velikovdefine internal i32 @g(i32 %x, i32 %y, ptr %p) noinline {
13de24d084SMomchil Velikoventry:
14de24d084SMomchil Velikov  %cmp = icmp sgt i32 %x, %y
15de24d084SMomchil Velikov  br i1 %cmp, label %if.then, label %if.else
16de24d084SMomchil Velikov
17de24d084SMomchil Velikovif.then:
18de24d084SMomchil Velikov  br label %if.end
19de24d084SMomchil Velikov
20de24d084SMomchil Velikovif.else:
21de24d084SMomchil Velikov  br label %if.end
22de24d084SMomchil Velikov
23de24d084SMomchil Velikovif.end:
24de24d084SMomchil Velikov  %x.addr.0 = phi i32 [ %x, %if.then ], [ 11, %if.else ]
25de24d084SMomchil Velikov  %p.addr.0 = phi ptr [ @G, %if.then ], [ %p, %if.else ]
26de24d084SMomchil Velikov  %call = call i32 @f(ptr %p.addr.0)
27de24d084SMomchil Velikov  %add = add nsw i32 %call, %x.addr.0
28de24d084SMomchil Velikov  ret i32 %add
29de24d084SMomchil Velikov}
30de24d084SMomchil Velikov
31de24d084SMomchil Velikovdefine i32 @h0(ptr %p) {
32de24d084SMomchil Velikoventry:
33de24d084SMomchil Velikov  %call = call i32 @g(i32 2, i32 1, ptr %p)
34de24d084SMomchil Velikov  ret i32 %call
35de24d084SMomchil Velikov}
36de24d084SMomchil Velikov
37de24d084SMomchil Velikovdefine i32 @h1() {
38de24d084SMomchil Velikoventry:
39de24d084SMomchil Velikov  %call = call i32 @f(ptr @G)
40de24d084SMomchil Velikov  ret i32 %call
41de24d084SMomchil Velikov}
42de24d084SMomchil Velikov
43de24d084SMomchil Velikovdefine i32 @h2() {
44de24d084SMomchil Velikoventry:
45de24d084SMomchil Velikov  %call = call i32 @f(ptr getelementptr inbounds (i32, ptr @G, i64 1))
46de24d084SMomchil Velikov  ret i32 %call
47de24d084SMomchil Velikov}
48de24d084SMomchil Velikov
49de24d084SMomchil Velikov; Check if specialisation on the address of a non-const global variable
50de24d084SMomchil Velikov; is not allowed, then it is not performed.
51de24d084SMomchil Velikov
52*93de97d7SAndreas Jonson; NO-GLOBALS-LABEL: define internal range(i32 -2147483646, -2147483648) i32 @g()
53de24d084SMomchil Velikov; NO-GLOBALS: call i32 @f(ptr @G)
54de24d084SMomchil Velikov
55*93de97d7SAndreas Jonson; NO-GLOBALS-LABEL: define range(i32 -2147483646, -2147483648) i32 @h0(ptr %p)
56de24d084SMomchil Velikov; NO-GLOBALS:call i32 @g()
57de24d084SMomchil Velikov
58de24d084SMomchil Velikov; NO-GLOBALS-LABEL: define i32 @h1()
59de24d084SMomchil Velikov; NO-GLOBALS: call i32 @f(ptr @G)
60de24d084SMomchil Velikov
61de24d084SMomchil Velikov; NO-GLOBALS-LABEL: define i32 @h2()
62de24d084SMomchil Velikov; NO-GLOBALS: call i32 @f(ptr getelementptr inbounds (i32, ptr @G, i64 1))
63de24d084SMomchil Velikov
64de24d084SMomchil Velikov; Check if specialisation on the address of a non-const global variable
65de24d084SMomchil Velikov; is allowed, then it is performed where possible.
66de24d084SMomchil Velikov
67*93de97d7SAndreas Jonson; GLOBALS-LABEL: define internal range(i32 -2147483646, -2147483648) i32 @g()
68e15d72adSAlexandros Lamprineas; GLOBALS: call i32 @f.specialized.2()
69de24d084SMomchil Velikov
70*93de97d7SAndreas Jonson; GLOBALS-LABEL: define range(i32 -2147483646, -2147483648) i32 @h0(ptr %p)
71de24d084SMomchil Velikov; GLOBALS: call i32 @g()
72de24d084SMomchil Velikov
73de24d084SMomchil Velikov; GLOBALS-LABEL: define i32 @h1()
74e15d72adSAlexandros Lamprineas; GLOBALS: call i32 @f.specialized.2()
75de24d084SMomchil Velikov
76de24d084SMomchil Velikov; GLOBALS-LABEL: define i32 @h2()
77e15d72adSAlexandros Lamprineas; GLOBALS: call i32 @f.specialized.1()
78de24d084SMomchil Velikov
79