1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -globalopt -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; globalopt should not sra the global, because it can't see the index. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker%struct.X = type { [3 x i32], [3 x i32] } 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; CHECK: @Y = internal unnamed_addr global [3 x %struct.X] zeroinitializer 8*9880d681SAndroid Build Coastguard Worker@Y = internal global [3 x %struct.X] zeroinitializer 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker@addr = external global i8 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine void @frob() { 13*9880d681SAndroid Build Coastguard Worker store i32 1, i32* getelementptr inbounds ([3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 0, i32 0, i64 ptrtoint (i8* @addr to i64)), align 4 14*9880d681SAndroid Build Coastguard Worker ret void 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @borf 18*9880d681SAndroid Build Coastguard Worker; CHECK: %a = load 19*9880d681SAndroid Build Coastguard Worker; CHECK: %b = load 20*9880d681SAndroid Build Coastguard Worker; CHECK: add i32 %a, %b 21*9880d681SAndroid Build Coastguard Workerdefine i32 @borf(i64 %i, i64 %j) { 22*9880d681SAndroid Build Coastguard Worker %p = getelementptr inbounds [3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 0, i32 0, i64 0 23*9880d681SAndroid Build Coastguard Worker %a = load i32, i32* %p 24*9880d681SAndroid Build Coastguard Worker %q = getelementptr inbounds [3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 0, i32 1, i64 0 25*9880d681SAndroid Build Coastguard Worker %b = load i32, i32* %q 26*9880d681SAndroid Build Coastguard Worker %c = add i32 %a, %b 27*9880d681SAndroid Build Coastguard Worker ret i32 %c 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @borg 31*9880d681SAndroid Build Coastguard Worker; CHECK: %a = load 32*9880d681SAndroid Build Coastguard Worker; CHECK: %b = load 33*9880d681SAndroid Build Coastguard Worker; CHECK: add i32 %a, %b 34*9880d681SAndroid Build Coastguard Workerdefine i32 @borg(i64 %i, i64 %j) { 35*9880d681SAndroid Build Coastguard Worker %p = getelementptr inbounds [3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 1, i32 0, i64 1 36*9880d681SAndroid Build Coastguard Worker %a = load i32, i32* %p 37*9880d681SAndroid Build Coastguard Worker %q = getelementptr inbounds [3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 1, i32 1, i64 1 38*9880d681SAndroid Build Coastguard Worker %b = load i32, i32* %q 39*9880d681SAndroid Build Coastguard Worker %c = add i32 %a, %b 40*9880d681SAndroid Build Coastguard Worker ret i32 %c 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @borh 44*9880d681SAndroid Build Coastguard Worker; CHECK: %a = load 45*9880d681SAndroid Build Coastguard Worker; CHECK: %b = load 46*9880d681SAndroid Build Coastguard Worker; CHECK: add i32 %a, %b 47*9880d681SAndroid Build Coastguard Workerdefine i32 @borh(i64 %i, i64 %j) { 48*9880d681SAndroid Build Coastguard Worker %p = getelementptr inbounds [3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 2, i32 0, i64 2 49*9880d681SAndroid Build Coastguard Worker %a = load i32, i32* %p 50*9880d681SAndroid Build Coastguard Worker %q = getelementptr inbounds [3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 2, i32 1, i64 2 51*9880d681SAndroid Build Coastguard Worker %b = load i32, i32* %q 52*9880d681SAndroid Build Coastguard Worker %c = add i32 %a, %b 53*9880d681SAndroid Build Coastguard Worker ret i32 %c 54*9880d681SAndroid Build Coastguard Worker} 55