1; RUN: opt < %s -passes=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, ptr getelementptr inbounds ([3 x %struct.X], ptr @Y, i64 0, i64 0, i32 0, i64 ptrtoint (ptr @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 %a = load i32, ptr @Y 23 %q = getelementptr inbounds [3 x %struct.X], ptr @Y, i64 0, i64 0, i32 1, i64 0 24 %b = load i32, ptr %q 25 %c = add i32 %a, %b 26 ret i32 %c 27} 28 29; CHECK-LABEL: @borg 30; CHECK: %a = load 31; CHECK: %b = load 32; CHECK: add i32 %a, %b 33define i32 @borg(i64 %i, i64 %j) { 34 %p = getelementptr inbounds [3 x %struct.X], ptr @Y, i64 0, i64 1, i32 0, i64 1 35 %a = load i32, ptr %p 36 %q = getelementptr inbounds [3 x %struct.X], ptr @Y, i64 0, i64 1, i32 1, i64 1 37 %b = load i32, ptr %q 38 %c = add i32 %a, %b 39 ret i32 %c 40} 41 42; CHECK-LABEL: @borh 43; CHECK: %a = load 44; CHECK: %b = load 45; CHECK: add i32 %a, %b 46define i32 @borh(i64 %i, i64 %j) { 47 %p = getelementptr inbounds [3 x %struct.X], ptr @Y, i64 0, i64 2, i32 0, i64 2 48 %a = load i32, ptr %p 49 %q = getelementptr inbounds [3 x %struct.X], ptr @Y, i64 0, i64 2, i32 1, i64 2 50 %b = load i32, ptr %q 51 %c = add i32 %a, %b 52 ret i32 %c 53} 54