180 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals2; RUN: opt -passes=globalopt -S %s | FileCheck %s3 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 zeroinitializer7 8;.9; CHECK: @[[A:[a-zA-Z0-9_$"\\.-]+]] = global i8 0, align 410;.11define internal void @read_struct() {12; CHECK-LABEL: @read_struct(13; CHECK-NEXT: ret void14;15 %tmp = load ptr, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 16), align 816 ret void17}18 19define void @write_struct() {20; CHECK-LABEL: @write_struct(21; CHECK-NEXT: tail call fastcc void @read_struct()22; CHECK-NEXT: ret void23;24 store ptr null, ptr @global, align 825 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 1), align 826 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 2), align 827 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 3), align 828 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 4), align 829 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 5), align 830 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 6), align 831 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 7), align 832 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 8), align 833 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 9), align 834 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 10), align 835 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 11), align 836 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 12), align 837 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 13), align 838 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 14), align 839 store ptr null, ptr getelementptr inbounds (%struct.widget, ptr @global, i64 0, i32 15), align 840 tail call void @read_struct()41 ret void42}43 44 45%struct.with.array = type { [100 x i64], i64 }46 47@global.array_in_struct = internal global %struct.with.array zeroinitializer48 49define internal void @read_non_array_field() {50; CHECK-LABEL: @read_non_array_field(51; CHECK-NEXT: ret void52;53 %tmp = load i64, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 1), align 854 ret void55}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 void61;62 store i64 0, ptr @global.array_in_struct, align 863 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 1), align 864 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 2), align 865 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 3), align 866 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 4), align 867 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 5), align 868 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 6), align 869 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 7), align 870 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 8), align 871 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 9), align 872 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 10), align 873 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 11), align 874 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 12), align 875 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 13), align 876 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 14), align 877 store i64 0, ptr getelementptr inbounds (%struct.with.array, ptr @global.array_in_struct, i64 0, i32 0, i32 15), align 878 tail call void @read_non_array_field()79 ret void80}81 82@global.array = internal global [100 x i64] zeroinitializer83 84define internal void @read_array() {85; CHECK-LABEL: @read_array(86; CHECK-NEXT: ret void87;88 %tmp = load i64, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 99), align 889 ret void90}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 void96;97 store i64 0, ptr @global.array, align 898 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 1), align 899 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 2), align 8100 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 3), align 8101 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 4), align 8102 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 5), align 8103 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 6), align 8104 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 7), align 8105 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 8), align 8106 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 9), align 8107 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 10), align 8108 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 11), align 8109 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 12), align 8110 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 13), align 8111 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 14), align 8112 store i64 0, ptr getelementptr inbounds ([100 x i64], ptr @global.array, i64 0, i32 15), align 8113 tail call void @read_array()114 ret void115}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 4120@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 4125; CHECK-NEXT: store volatile i8 4, ptr @a, align 4126; CHECK-NEXT: store volatile i8 5, ptr @a, align 4127; CHECK-NEXT: store volatile i8 4, ptr @a, align 4128; CHECK-NEXT: store volatile i8 4, ptr @a, align 4129; CHECK-NEXT: store volatile i8 4, ptr @a, align 4130; CHECK-NEXT: store volatile i8 4, ptr @a, align 4131; CHECK-NEXT: store volatile i8 4, ptr @a, align 4132; CHECK-NEXT: store volatile i8 5, ptr @a, align 4133; CHECK-NEXT: store volatile i8 4, ptr @a, align 4134; CHECK-NEXT: store volatile i8 4, ptr @a, align 4135; CHECK-NEXT: store volatile i8 4, ptr @a, align 4136; CHECK-NEXT: store volatile i8 4, ptr @a, align 4137; CHECK-NEXT: store volatile i8 4, ptr @a, align 4138; CHECK-NEXT: store volatile i8 4, ptr @a, align 4139; CHECK-NEXT: store volatile i8 4, ptr @a, align 4140; CHECK-NEXT: store volatile i8 4, ptr @a, align 4141; CHECK-NEXT: ret void142;143 store i8 0, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 1), align 1144 %i3 = load i8, ptr @b, align 16145 store volatile i8 %i3, ptr @a, align 4146 %i4 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 2), align 2147 store volatile i8 %i4, ptr @a, align 4148 %i5 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 3), align 1149 store volatile i8 %i5, ptr @a, align 4150 %i6 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 4), align 4151 store volatile i8 %i6, ptr @a, align 4152 %i7 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 5), align 1153 store volatile i8 %i7, ptr @a, align 4154 %i8 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 7), align 1155 store volatile i8 %i8, ptr @a, align 4156 %i9 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 8), align 8157 store volatile i8 %i9, ptr @a, align 4158 %i10 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 9), align 1159 store volatile i8 %i10, ptr @a, align 4160 %i11 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 10), align 2161 store volatile i8 %i11, ptr @a, align 4162 %i12 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 11), align 1163 store volatile i8 %i12, ptr @a, align 4164 %i13 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 12), align 4165 store volatile i8 %i13, ptr @a, align 4166 %i14 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 13), align 1167 store volatile i8 %i14, ptr @a, align 4168 %i15 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 14), align 2169 store volatile i8 %i15, ptr @a, align 4170 %i16 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 15), align 1171 store volatile i8 %i16, ptr @a, align 4172 %i17 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 16), align 16173 store volatile i8 %i17, ptr @a, align 4174 %i18 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 17), align 1175 store volatile i8 %i18, ptr @a, align 4176 %i19 = load i8, ptr getelementptr inbounds (%struct.20i8, ptr @b, i64 0, i32 18), align 2177 store volatile i8 %i19, ptr @a, align 4178 ret void179}180