150
|
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
|
|
12 define 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
|
|
21 define 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
|
|
34 define 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
|
|
47 define 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 }
|