1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals 2; RUN: opt -passes=globalopt -S %s | FileCheck %s 3 4%struct.widget = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr } 5 6@global = internal global %struct.widget zeroinitializer 7 8;. 9; CHECK: @[[A:[a-zA-Z0-9_$"\\.-]+]] = global i8 0, align 4 10;. 11define internal void @read_struct() { 12; CHECK-LABEL: @read_struct( 13; CHECK-NEXT: ret void 14; 15 %tmp = load ptr, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 16), align 8 16 ret void 17} 18 19define void @write_struct() { 20; CHECK-LABEL: @write_struct( 21; CHECK-NEXT: tail call fastcc void @read_struct() 22; CHECK-NEXT: ret void 23; 24 store ptr null, ptr @global, align 8 25 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 1), align 8 26 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 2), align 8 27 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 3), align 8 28 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 4), align 8 29 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 5), align 8 30 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 6), align 8 31 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 7), align 8 32 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 8), align 8 33 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 9), align 8 34 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 10), align 8 35 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 11), align 8 36 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 12), align 8 37 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 13), align 8 38 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 14), align 8 39 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 15), align 8 40 tail call void @read_struct() 41 ret void 42} 43 44 45%struct.with.array = type { [100 x i64], i64 } 46 47@global.array_in_struct = internal global %struct.with.array zeroinitializer 48 49define internal void @read_non_array_field() { 50; CHECK-LABEL: @read_non_array_field( 51; CHECK-NEXT: ret void 52; 53 %tmp = load i64, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 1), align 8 54 ret void 55} 56 57define void @store_to_struct_array() { 58; CHECK-LABEL: @store_to_struct_array( 59; CHECK-NEXT: tail call fastcc void @read_non_array_field() 60; CHECK-NEXT: ret void 61; 62 store i64 0, ptr @global.array_in_struct, align 8 63 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 1), align 8 64 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 2), align 8 65 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 3), align 8 66 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 4), align 8 67 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 5), align 8 68 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 6), align 8 69 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 7), align 8 70 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 8), align 8 71 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 9), align 8 72 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 10), align 8 73 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 11), align 8 74 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 12), align 8 75 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 13), align 8 76 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 14), align 8 77 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 15), align 8 78 tail call void @read_non_array_field() 79 ret void 80} 81 82@global.array = internal global [100 x i64] zeroinitializer 83 84define internal void @read_array() { 85; CHECK-LABEL: @read_array( 86; CHECK-NEXT: ret void 87; 88 %tmp = load i64, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 99), align 8 89 ret void 90} 91 92define void @store_to_array() { 93; CHECK-LABEL: @store_to_array( 94; CHECK-NEXT: tail call fastcc void @read_array() 95; CHECK-NEXT: ret void 96; 97 store i64 0, ptr @global.array, align 8 98 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 1), align 8 99 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 2), align 8 100 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 3), align 8 101 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 4), align 8 102 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 5), align 8 103 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 6), align 8 104 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 7), align 8 105 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 8), align 8 106 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 9), align 8 107 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 10), align 8 108 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 11), align 8 109 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 12), align 8 110 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 13), align 8 111 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 14), align 8 112 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 15), align 8 113 tail call void @read_array() 114 ret void 115} 116 117 118%struct.20i8 = type { i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8 } 119@a = global i8 0, align 4 120@b = internal global %struct.20i8 { i8 4, i8 4, i8 4, i8 5, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 5, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4 } 121 122define void @test_single_write_to_global_b() { 123; CHECK-LABEL: @test_single_write_to_global_b( 124; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 125; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 126; CHECK-NEXT: store volatile i8 5, ptr @a, align 4 127; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 128; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 129; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 130; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 131; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 132; CHECK-NEXT: store volatile i8 5, ptr @a, align 4 133; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 134; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 135; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 136; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 137; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 138; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 139; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 140; CHECK-NEXT: store volatile i8 4, ptr @a, align 4 141; CHECK-NEXT: ret void 142; 143 store i8 0, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 1), align 1 144 %i3 = load i8, ptr @b, align 16 145 store volatile i8 %i3, ptr @a, align 4 146 %i4 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 2), align 2 147 store volatile i8 %i4, ptr @a, align 4 148 %i5 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 3), align 1 149 store volatile i8 %i5, ptr @a, align 4 150 %i6 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 4), align 4 151 store volatile i8 %i6, ptr @a, align 4 152 %i7 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 5), align 1 153 store volatile i8 %i7, ptr @a, align 4 154 %i8 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 7), align 1 155 store volatile i8 %i8, ptr @a, align 4 156 %i9 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 8), align 8 157 store volatile i8 %i9, ptr @a, align 4 158 %i10 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 9), align 1 159 store volatile i8 %i10, ptr @a, align 4 160 %i11 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 10), align 2 161 store volatile i8 %i11, ptr @a, align 4 162 %i12 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 11), align 1 163 store volatile i8 %i12, ptr @a, align 4 164 %i13 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 12), align 4 165 store volatile i8 %i13, ptr @a, align 4 166 %i14 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 13), align 1 167 store volatile i8 %i14, ptr @a, align 4 168 %i15 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 14), align 2 169 store volatile i8 %i15, ptr @a, align 4 170 %i16 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 15), align 1 171 store volatile i8 %i16, ptr @a, align 4 172 %i17 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 16), align 16 173 store volatile i8 %i17, ptr @a, align 4 174 %i18 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 17), align 1 175 store volatile i8 %i18, ptr @a, align 4 176 %i19 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 18), align 2 177 store volatile i8 %i19, ptr @a, align 4 178 ret void 179} 180