1 ; RUN: opt < %s -globalopt -S > %t 2 ; RUN: grep "@Y = internal unnamed_addr global \[3 x [%]struct.X\] zeroinitializer" %t 3 ; RUN: grep load %t | count 6 4 ; RUN: grep "add i32 [%]a, [%]b" %t | count 3 5 6 ; globalopt should not sra the global, because it can't see the index. 7 8 %struct.X = type { [3 x i32], [3 x i32] } 9 10 @Y = internal global [3 x %struct.X] zeroinitializer 11 12 @addr = external global i8 13 14 define void @frob() { 15 store i32 1, i32* getelementptr inbounds ([3 x %struct.X]* @Y, i64 0, i64 0, i32 0, i64 ptrtoint (i8* @addr to i64)), align 4 16 ret void 17 } 18 define i32 @borf(i64 %i, i64 %j) { 19 %p = getelementptr inbounds [3 x %struct.X]* @Y, i64 0, i64 0, i32 0, i64 0 20 %a = load i32* %p 21 %q = getelementptr inbounds [3 x %struct.X]* @Y, i64 0, i64 0, i32 1, i64 0 22 %b = load i32* %q 23 %c = add i32 %a, %b 24 ret i32 %c 25 } 26 define i32 @borg(i64 %i, i64 %j) { 27 %p = getelementptr inbounds [3 x %struct.X]* @Y, i64 0, i64 1, i32 0, i64 1 28 %a = load i32* %p 29 %q = getelementptr inbounds [3 x %struct.X]* @Y, i64 0, i64 1, i32 1, i64 1 30 %b = load i32* %q 31 %c = add i32 %a, %b 32 ret i32 %c 33 } 34 define i32 @borh(i64 %i, i64 %j) { 35 %p = getelementptr inbounds [3 x %struct.X]* @Y, i64 0, i64 2, i32 0, i64 2 36 %a = load i32* %p 37 %q = getelementptr inbounds [3 x %struct.X]* @Y, i64 0, i64 2, i32 1, i64 2 38 %b = load i32* %q 39 %c = add i32 %a, %b 40 ret i32 %c 41 } 42