xref: /aosp_15_r20/external/llvm/test/Transforms/GlobalOpt/invariant.group.barrier.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -globalopt < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; This test is hint, what could globalOpt optimize and what it can't
4*9880d681SAndroid Build Coastguard Worker; FIXME: @tmp and @tmp2 can be safely set to 42
5*9880d681SAndroid Build Coastguard Worker; CHECK: @tmp = local_unnamed_addr global i32 0
6*9880d681SAndroid Build Coastguard Worker; CHECK: @tmp2 = local_unnamed_addr global i32 0
7*9880d681SAndroid Build Coastguard Worker; CHECK: @tmp3 = global i32 0
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker@tmp = global i32 0
10*9880d681SAndroid Build Coastguard Worker@tmp2 = global i32 0
11*9880d681SAndroid Build Coastguard Worker@tmp3 = global i32 0
12*9880d681SAndroid Build Coastguard Worker@ptrToTmp3 = global i32* null
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine i32 @TheAnswerToLifeTheUniverseAndEverything() {
17*9880d681SAndroid Build Coastguard Worker  ret i32 42
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine void @_GLOBAL__I_a() {
21*9880d681SAndroid Build Coastguard Workerenter:
22*9880d681SAndroid Build Coastguard Worker  call void @_optimizable()
23*9880d681SAndroid Build Coastguard Worker  call void @_not_optimizable()
24*9880d681SAndroid Build Coastguard Worker  ret void
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdefine void @_optimizable() {
28*9880d681SAndroid Build Coastguard Workerenter:
29*9880d681SAndroid Build Coastguard Worker  %valptr = alloca i32
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker  %val = call i32 @TheAnswerToLifeTheUniverseAndEverything()
32*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* @tmp
33*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %valptr
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i32* %valptr to i8*
36*9880d681SAndroid Build Coastguard Worker  %barr = call i8* @llvm.invariant.group.barrier(i8* %0)
37*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i8* %barr to i32*
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker  %val2 = load i32, i32* %1
40*9880d681SAndroid Build Coastguard Worker  store i32 %val2, i32* @tmp2
41*9880d681SAndroid Build Coastguard Worker  ret void
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker; We can't step through invariant.group.barrier here, because that would change
45*9880d681SAndroid Build Coastguard Worker; this load in @usage_of_globals()
46*9880d681SAndroid Build Coastguard Worker; val = load i32, i32* %ptrVal, !invariant.group !0
47*9880d681SAndroid Build Coastguard Worker; into
48*9880d681SAndroid Build Coastguard Worker; %val = load i32, i32* @tmp3, !invariant.group !0
49*9880d681SAndroid Build Coastguard Worker; and then we could assume that %val and %val2 to be the same, which coud be
50*9880d681SAndroid Build Coastguard Worker; false, because @changeTmp3ValAndCallBarrierInside() may change the value
51*9880d681SAndroid Build Coastguard Worker; of @tmp3.
52*9880d681SAndroid Build Coastguard Workerdefine void @_not_optimizable() {
53*9880d681SAndroid Build Coastguard Workerenter:
54*9880d681SAndroid Build Coastguard Worker  store i32 13, i32* @tmp3, !invariant.group !0
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i32* @tmp3 to i8*
57*9880d681SAndroid Build Coastguard Worker  %barr = call i8* @llvm.invariant.group.barrier(i8* %0)
58*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i8* %barr to i32*
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker  store i32* %1, i32** @ptrToTmp3
61*9880d681SAndroid Build Coastguard Worker  store i32 42, i32* %1, !invariant.group !0
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker  ret void
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Workerdefine void @usage_of_globals() {
66*9880d681SAndroid Build Coastguard Workerentry:
67*9880d681SAndroid Build Coastguard Worker  %ptrVal = load i32*, i32** @ptrToTmp3
68*9880d681SAndroid Build Coastguard Worker  %val = load i32, i32* %ptrVal, !invariant.group !0
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker  call void @changeTmp3ValAndCallBarrierInside()
71*9880d681SAndroid Build Coastguard Worker  %val2 = load i32, i32* @tmp3, !invariant.group !0
72*9880d681SAndroid Build Coastguard Worker  ret void;
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdeclare void @changeTmp3ValAndCallBarrierInside()
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.invariant.group.barrier(i8*)
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker!0 = !{!"something"}
80