1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -S -globalopt | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker@.str91250 = global [3 x i8] zeroinitializer 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; CHECK: @A = local_unnamed_addr global i1 false 8*9880d681SAndroid Build Coastguard Worker@A = global i1 icmp ne (i64 sub nsw (i64 ptrtoint (i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str91250, i64 0, i64 1) to i64), i64 ptrtoint ([3 x i8]* @.str91250 to i64)), i64 1) 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; PR11352 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker@xs = global [2 x i32] zeroinitializer, align 4 13*9880d681SAndroid Build Coastguard Worker; CHECK: @xs = local_unnamed_addr global [2 x i32] [i32 1, i32 1] 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; PR12642 16*9880d681SAndroid Build Coastguard Worker%PR12642.struct = type { i8 } 17*9880d681SAndroid Build Coastguard Worker@PR12642.s = global <{}> zeroinitializer, align 1 18*9880d681SAndroid Build Coastguard Worker@PR12642.p = constant %PR12642.struct* bitcast (i8* getelementptr (i8, i8* bitcast (<{}>* @PR12642.s to i8*), i64 1) to %PR12642.struct*), align 8 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine internal void @test1() { 21*9880d681SAndroid Build Coastguard Workerentry: 22*9880d681SAndroid Build Coastguard Worker store i32 1, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @xs, i64 0, i64 0) 23*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @xs, i32 0, i64 0), align 4 24*9880d681SAndroid Build Coastguard Worker store i32 %0, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @xs, i64 0, i64 1) 25*9880d681SAndroid Build Coastguard Worker ret void 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; PR12060 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker%closure = type { i32 } 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker@f = internal global %closure zeroinitializer, align 4 33*9880d681SAndroid Build Coastguard Worker@m = global i32 0, align 4 34*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @f 35*9880d681SAndroid Build Coastguard Worker; CHECK: @m = local_unnamed_addr global i32 13 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine internal i32 @test2_helper(%closure* %this, i32 %b) { 38*9880d681SAndroid Build Coastguard Workerentry: 39*9880d681SAndroid Build Coastguard Worker %0 = getelementptr inbounds %closure, %closure* %this, i32 0, i32 0 40*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %0, align 4 41*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %1, %b 42*9880d681SAndroid Build Coastguard Worker ret i32 %add 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine internal void @test2() { 46*9880d681SAndroid Build Coastguard Workerentry: 47*9880d681SAndroid Build Coastguard Worker store i32 4, i32* getelementptr inbounds (%closure, %closure* @f, i32 0, i32 0) 48*9880d681SAndroid Build Coastguard Worker %call = call i32 @test2_helper(%closure* @f, i32 9) 49*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* @m, align 4 50*9880d681SAndroid Build Coastguard Worker ret void 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker; PR19955 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker@dllimportptr = global i32* null, align 4 56*9880d681SAndroid Build Coastguard Worker; CHECK: @dllimportptr = local_unnamed_addr global i32* null, align 4 57*9880d681SAndroid Build Coastguard Worker@dllimportvar = external dllimport global i32 58*9880d681SAndroid Build Coastguard Workerdefine internal void @test3() { 59*9880d681SAndroid Build Coastguard Workerentry: 60*9880d681SAndroid Build Coastguard Worker store i32* @dllimportvar, i32** @dllimportptr, align 4 61*9880d681SAndroid Build Coastguard Worker ret void 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker@dllexportptr = global i32* null, align 4 65*9880d681SAndroid Build Coastguard Worker; CHECK: @dllexportptr = local_unnamed_addr global i32* @dllexportvar, align 4 66*9880d681SAndroid Build Coastguard Worker@dllexportvar = dllexport global i32 0, align 4 67*9880d681SAndroid Build Coastguard Worker; CHECK: @dllexportvar = dllexport global i32 20, align 4 68*9880d681SAndroid Build Coastguard Workerdefine internal void @test4() { 69*9880d681SAndroid Build Coastguard Workerentry: 70*9880d681SAndroid Build Coastguard Worker store i32 20, i32* @dllexportvar, align 4 71*9880d681SAndroid Build Coastguard Worker store i32* @dllexportvar, i32** @dllexportptr, align 4 72*9880d681SAndroid Build Coastguard Worker ret void 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker@threadlocalptr = global i32* null, align 4 76*9880d681SAndroid Build Coastguard Worker; CHECK: @threadlocalptr = global i32* null, align 4 77*9880d681SAndroid Build Coastguard Worker@threadlocalvar = external thread_local global i32 78*9880d681SAndroid Build Coastguard Workerdefine internal void @test5() { 79*9880d681SAndroid Build Coastguard Workerentry: 80*9880d681SAndroid Build Coastguard Worker store i32* @threadlocalvar, i32** @threadlocalptr, align 4 81*9880d681SAndroid Build Coastguard Worker ret void 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker@test6_v1 = internal global { i32, i32 } { i32 42, i32 0 }, align 8 85*9880d681SAndroid Build Coastguard Worker@test6_v2 = global i32 0, align 4 86*9880d681SAndroid Build Coastguard Worker; CHECK: @test6_v2 = local_unnamed_addr global i32 42, align 4 87*9880d681SAndroid Build Coastguard Workerdefine internal void @test6() { 88*9880d681SAndroid Build Coastguard Worker %load = load { i32, i32 }, { i32, i32 }* @test6_v1, align 8 89*9880d681SAndroid Build Coastguard Worker %xv0 = extractvalue { i32, i32 } %load, 0 90*9880d681SAndroid Build Coastguard Worker %iv = insertvalue { i32, i32 } %load, i32 %xv0, 1 91*9880d681SAndroid Build Coastguard Worker %xv1 = extractvalue { i32, i32 } %iv, 1 92*9880d681SAndroid Build Coastguard Worker store i32 %xv1, i32* @test6_v2, align 4 93*9880d681SAndroid Build Coastguard Worker ret void 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker@llvm.global_ctors = appending constant 97*9880d681SAndroid Build Coastguard Worker [6 x { i32, void ()* }] 98*9880d681SAndroid Build Coastguard Worker [{ i32, void ()* } { i32 65535, void ()* @test1 }, 99*9880d681SAndroid Build Coastguard Worker { i32, void ()* } { i32 65535, void ()* @test2 }, 100*9880d681SAndroid Build Coastguard Worker { i32, void ()* } { i32 65535, void ()* @test3 }, 101*9880d681SAndroid Build Coastguard Worker { i32, void ()* } { i32 65535, void ()* @test4 }, 102*9880d681SAndroid Build Coastguard Worker { i32, void ()* } { i32 65535, void ()* @test5 }, 103*9880d681SAndroid Build Coastguard Worker { i32, void ()* } { i32 65535, void ()* @test6 }] 104