Home | History | Annotate | Download | only in GlobalOpt
      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