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