1*9880d681SAndroid Build Coastguard Worker; RUN: opt -globalopt -S < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker@G1 = internal global i32 5 4*9880d681SAndroid Build Coastguard Worker@G2 = internal global i32 5 5*9880d681SAndroid Build Coastguard Worker@G3 = internal global i32 5 6*9880d681SAndroid Build Coastguard Worker@G4 = internal global i32 5 7*9880d681SAndroid Build Coastguard Worker@G5 = internal global i32 5 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 10*9880d681SAndroid Build Coastguard Workerdefine internal i32 @test1() norecurse { 11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @G1 12*9880d681SAndroid Build Coastguard Worker store i32 4, i32* @G1 13*9880d681SAndroid Build Coastguard Worker %a = load i32, i32* @G1 14*9880d681SAndroid Build Coastguard Worker; CHECK: ret 15*9880d681SAndroid Build Coastguard Worker ret i32 %a 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; The load comes before the store which makes @G2 live before the call. 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2 20*9880d681SAndroid Build Coastguard Workerdefine internal i32 @test2() norecurse { 21*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %G2 22*9880d681SAndroid Build Coastguard Worker %a = load i32, i32* @G2 23*9880d681SAndroid Build Coastguard Worker store i32 4, i32* @G2 24*9880d681SAndroid Build Coastguard Worker; CHECK: ret 25*9880d681SAndroid Build Coastguard Worker ret i32 %a 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; This global is indexed by a GEP - this makes it partial alias and we bail out. 29*9880d681SAndroid Build Coastguard Worker; FIXME: We don't actually have to bail out in this case. 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3 32*9880d681SAndroid Build Coastguard Workerdefine internal i32 @test3() norecurse { 33*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %G3 34*9880d681SAndroid Build Coastguard Worker %x = getelementptr i32,i32* @G3, i32 0 35*9880d681SAndroid Build Coastguard Worker %a = load i32, i32* %x 36*9880d681SAndroid Build Coastguard Worker store i32 4, i32* @G3 37*9880d681SAndroid Build Coastguard Worker; CHECK: ret 38*9880d681SAndroid Build Coastguard Worker ret i32 %a 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; The global is casted away to a larger type then loaded. The store only partially 42*9880d681SAndroid Build Coastguard Worker; covers the load, so we must not demote. 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4 45*9880d681SAndroid Build Coastguard Workerdefine internal i32 @test4() norecurse { 46*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %G4 47*9880d681SAndroid Build Coastguard Worker store i32 4, i32* @G4 48*9880d681SAndroid Build Coastguard Worker %x = bitcast i32* @G4 to i64* 49*9880d681SAndroid Build Coastguard Worker %a = load i64, i64* %x 50*9880d681SAndroid Build Coastguard Worker %b = trunc i64 %a to i32 51*9880d681SAndroid Build Coastguard Worker; CHECK: ret 52*9880d681SAndroid Build Coastguard Worker ret i32 %b 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; The global is casted away to a smaller type then loaded. This one is fine. 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5 58*9880d681SAndroid Build Coastguard Workerdefine internal i32 @test5() norecurse { 59*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @G5 60*9880d681SAndroid Build Coastguard Worker store i32 4, i32* @G5 61*9880d681SAndroid Build Coastguard Worker %x = bitcast i32* @G5 to i16* 62*9880d681SAndroid Build Coastguard Worker %a = load i16, i16* %x 63*9880d681SAndroid Build Coastguard Worker %b = zext i16 %a to i32 64*9880d681SAndroid Build Coastguard Worker; CHECK: ret 65*9880d681SAndroid Build Coastguard Worker ret i32 %b 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine i32 @main() norecurse { 69*9880d681SAndroid Build Coastguard Worker %a = call i32 @test1() 70*9880d681SAndroid Build Coastguard Worker %b = call i32 @test2() 71*9880d681SAndroid Build Coastguard Worker %c = call i32 @test3() 72*9880d681SAndroid Build Coastguard Worker %d = call i32 @test4() 73*9880d681SAndroid Build Coastguard Worker %e = call i32 @test5() 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker %x = or i32 %a, %b 76*9880d681SAndroid Build Coastguard Worker %y = or i32 %x, %c 77*9880d681SAndroid Build Coastguard Worker %z = or i32 %y, %d 78*9880d681SAndroid Build Coastguard Worker %w = or i32 %z, %e 79*9880d681SAndroid Build Coastguard Worker ret i32 %w 80*9880d681SAndroid Build Coastguard Worker} 81