xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/global-merge.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumb-apple-darwin -arm-global-merge -global-merge-group-by-use=false -global-merge-on-const=true | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; Test the ARMGlobalMerge pass.  Use -march=thumb because it has a small
3*9880d681SAndroid Build Coastguard Worker; value for the maximum offset (127).
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; A local array that exceeds the maximum offset should not be merged.
6*9880d681SAndroid Build Coastguard Worker; CHECK: g0:
7*9880d681SAndroid Build Coastguard Worker@g0 = internal global [32 x i32] [ i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2 ]
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; Global variables marked with "used" attribute must be kept
10*9880d681SAndroid Build Coastguard Worker; CHECK: g8
11*9880d681SAndroid Build Coastguard Worker@g8 = internal global i32 0
12*9880d681SAndroid Build Coastguard Worker@llvm.used = appending global [1 x i8*] [i8* bitcast (i32* @g8 to i8*)], section "llvm.metadata"
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; Global used in landing pad instruction must be kept
15*9880d681SAndroid Build Coastguard Worker; CHECK: ZTIi
16*9880d681SAndroid Build Coastguard Worker@_ZTIi = internal global i8* null
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerdefine i32 @_Z9exceptioni(i32 %arg) personality i8* bitcast (i32 (...)* @__gxx_personality_sj0 to i8*) {
19*9880d681SAndroid Build Coastguard Workerbb:
20*9880d681SAndroid Build Coastguard Worker  %tmp = invoke i32 @_Z14throwSomethingi(i32 %arg)
21*9880d681SAndroid Build Coastguard Worker          to label %bb9 unwind label %bb1
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerbb1:                                              ; preds = %bb
24*9880d681SAndroid Build Coastguard Worker  %tmp2 = landingpad { i8*, i32 }
25*9880d681SAndroid Build Coastguard Worker          catch i8* bitcast (i8** @_ZTIi to i8*)
26*9880d681SAndroid Build Coastguard Worker  %tmp3 = extractvalue { i8*, i32 } %tmp2, 1
27*9880d681SAndroid Build Coastguard Worker  %tmp4 = tail call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*))
28*9880d681SAndroid Build Coastguard Worker  %tmp5 = icmp eq i32 %tmp3, %tmp4
29*9880d681SAndroid Build Coastguard Worker  br i1 %tmp5, label %bb6, label %bb10
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerbb6:                                              ; preds = %bb1
32*9880d681SAndroid Build Coastguard Worker  %tmp7 = extractvalue { i8*, i32 } %tmp2, 0
33*9880d681SAndroid Build Coastguard Worker  %tmp8 = tail call i8* @__cxa_begin_catch(i8* %tmp7)
34*9880d681SAndroid Build Coastguard Worker  tail call void @__cxa_end_catch()
35*9880d681SAndroid Build Coastguard Worker  br label %bb9
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerbb9:                                              ; preds = %bb6, %bb
38*9880d681SAndroid Build Coastguard Worker  %res.0 = phi i32 [ 0, %bb6 ], [ %tmp, %bb ]
39*9880d681SAndroid Build Coastguard Worker  ret i32 %res.0
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerbb10:                                             ; preds = %bb1
42*9880d681SAndroid Build Coastguard Worker  resume { i8*, i32 } %tmp2
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdeclare i32 @_Z14throwSomethingi(i32)
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_sj0(...)
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.eh.typeid.for(i8*)
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdeclare i8* @__cxa_begin_catch(i8*)
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdeclare void @__cxa_end_catch()
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; CHECK: _MergedGlobals:
56*9880d681SAndroid Build Coastguard Worker@g1 = internal global i32 1
57*9880d681SAndroid Build Coastguard Worker@g2 = internal global i32 2
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; Make sure that the complete variable fits within the range of the maximum
60*9880d681SAndroid Build Coastguard Worker; offset.  Having the starting offset in range is not sufficient.
61*9880d681SAndroid Build Coastguard Worker; When this works properly, @g3 is placed in a separate chunk of merged globals.
62*9880d681SAndroid Build Coastguard Worker; CHECK: _MergedGlobals.1:
63*9880d681SAndroid Build Coastguard Worker@g3 = internal global [30 x i32] [ i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10 ], align 4
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker; Global variables that can be placed in BSS should be kept together in a
66*9880d681SAndroid Build Coastguard Worker; separate pool of merged globals.
67*9880d681SAndroid Build Coastguard Worker; CHECK: _MergedGlobals.2
68*9880d681SAndroid Build Coastguard Worker@g4 = internal global i32 0
69*9880d681SAndroid Build Coastguard Worker@g5 = internal global i32 0
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; Global variables that are constant can be merged together
72*9880d681SAndroid Build Coastguard Worker; CHECK: _MergedGlobals.3
73*9880d681SAndroid Build Coastguard Worker@g6 = internal constant [12 x i32] zeroinitializer, align 4
74*9880d681SAndroid Build Coastguard Worker@g7 = internal constant [12 x i32] zeroinitializer, align 4
75