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