xref: /llvm-project/llvm/test/Transforms/GlobalOpt/sra-many-stores-once.ll (revision 2d69827c5c754f0eca98e497ecf0e52ed54b4fd3)
15c39ec73SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
25c39ec73SFlorian Hahn; RUN: opt -passes=globalopt -S %s | FileCheck %s
35c39ec73SFlorian Hahn
45c39ec73SFlorian Hahntarget datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
55c39ec73SFlorian Hahn
65c39ec73SFlorian Hahn%struct.20ptr = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
75c39ec73SFlorian Hahn@global.20ptr = internal global %struct.20ptr zeroinitializer
85c39ec73SFlorian Hahn
95c39ec73SFlorian Hahndeclare i32 @fn0()
105c39ec73SFlorian Hahndeclare i32 @fn1()
115c39ec73SFlorian Hahndeclare i32 @fn2()
125c39ec73SFlorian Hahndeclare i32 @fn3()
135c39ec73SFlorian Hahn
145c39ec73SFlorian Hahn;.
155c39ec73SFlorian Hahn; CHECK: @[[GLOBAL_20PTR:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global [[STRUCT_20PTR:%.*]] zeroinitializer
165c39ec73SFlorian Hahn;.
175c39ec73SFlorian Hahn
185c39ec73SFlorian Hahn; FIXME: The loads from @global.20ptr cannot load null, as the loaded value are
195c39ec73SFlorian Hahn; used as called operands. The loads and stores can be removed.
205c39ec73SFlorian Hahndefine void @test_stored_once_call_with_nullptr_ub() {
215c39ec73SFlorian Hahn; CHECK-LABEL: @test_stored_once_call_with_nullptr_ub(
225c39ec73SFlorian Hahn; CHECK-NEXT:  entry:
235c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn0, ptr @global.20ptr, align 8
245c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn1, ptr @global.20ptr, align 8
255c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn2, ptr getelementptr inbounds ([[STRUCT_20PTR:%.*]], ptr @global.20ptr, i64 0, i32 1), align 8
265c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn3, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 2), align 8
275c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn0, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 3), align 8
285c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn1, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 4), align 8
295c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn2, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 5), align 8
305c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn3, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 6), align 8
315c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn0, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 7), align 8
325c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn1, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 8), align 8
335c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn2, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 9), align 8
345c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn3, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 10), align 8
355c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn0, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 11), align 8
365c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn1, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 12), align 8
375c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn2, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 13), align 8
385c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn3, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 14), align 8
395c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn0, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 15), align 8
405c39ec73SFlorian Hahn; CHECK-NEXT:    store ptr @fn1, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 16), align 8
415c39ec73SFlorian Hahn; CHECK-NEXT:    [[L0:%.*]] = load ptr, ptr @global.20ptr, align 8
425c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L0]]()
435c39ec73SFlorian Hahn; CHECK-NEXT:    [[L1:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 1), align 8
445c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L1]]()
455c39ec73SFlorian Hahn; CHECK-NEXT:    [[L2:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 2), align 8
465c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L2]]()
475c39ec73SFlorian Hahn; CHECK-NEXT:    [[L3:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 3), align 8
485c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L3]]()
495c39ec73SFlorian Hahn; CHECK-NEXT:    [[L4:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 4), align 8
505c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L4]]()
515c39ec73SFlorian Hahn; CHECK-NEXT:    [[L5:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 5), align 8
525c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L5]]()
535c39ec73SFlorian Hahn; CHECK-NEXT:    [[L6:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 6), align 8
545c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L6]]()
555c39ec73SFlorian Hahn; CHECK-NEXT:    [[L7:%.*]] = load ptr, ptr @global.20ptr, align 8
565c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L7]]()
575c39ec73SFlorian Hahn; CHECK-NEXT:    [[L8:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 7), align 8
585c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L8]]()
595c39ec73SFlorian Hahn; CHECK-NEXT:    [[L9:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 8), align 8
605c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L9]]()
615c39ec73SFlorian Hahn; CHECK-NEXT:    [[L10:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 9), align 8
625c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L10]]()
635c39ec73SFlorian Hahn; CHECK-NEXT:    [[L11:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 10), align 8
645c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L11]]()
655c39ec73SFlorian Hahn; CHECK-NEXT:    [[L12:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 11), align 8
665c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L12]]()
675c39ec73SFlorian Hahn; CHECK-NEXT:    [[L13:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 12), align 8
685c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L13]]()
695c39ec73SFlorian Hahn; CHECK-NEXT:    [[L14:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 13), align 8
705c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L14]]()
715c39ec73SFlorian Hahn; CHECK-NEXT:    [[L15:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 14), align 8
725c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L15]]()
735c39ec73SFlorian Hahn; CHECK-NEXT:    [[L16:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 15), align 8
745c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L16]]()
755c39ec73SFlorian Hahn; CHECK-NEXT:    [[L17:%.*]] = load ptr, ptr getelementptr inbounds ([[STRUCT_20PTR]], ptr @global.20ptr, i64 0, i32 16), align 8
765c39ec73SFlorian Hahn; CHECK-NEXT:    call void [[L17]]()
775c39ec73SFlorian Hahn; CHECK-NEXT:    ret void
785c39ec73SFlorian Hahn;
795c39ec73SFlorian Hahnentry:
805c39ec73SFlorian Hahn  store ptr @fn0, ptr @global.20ptr, align 8
81*2d69827cSNikita Popov  store ptr @fn1, ptr @global.20ptr, align 8
825c39ec73SFlorian Hahn  store ptr @fn2, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 1), align 8
835c39ec73SFlorian Hahn  store ptr @fn3, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 2), align 8
845c39ec73SFlorian Hahn  store ptr @fn0, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 3), align 8
855c39ec73SFlorian Hahn  store ptr @fn1, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 4), align 8
865c39ec73SFlorian Hahn  store ptr @fn2, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 5), align 8
875c39ec73SFlorian Hahn  store ptr @fn3, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 6), align 8
885c39ec73SFlorian Hahn  store ptr @fn0, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 7), align 8
895c39ec73SFlorian Hahn  store ptr @fn1, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 8), align 8
905c39ec73SFlorian Hahn  store ptr @fn2, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 9), align 8
915c39ec73SFlorian Hahn  store ptr @fn3, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 10), align 8
925c39ec73SFlorian Hahn  store ptr @fn0, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 11), align 8
935c39ec73SFlorian Hahn  store ptr @fn1, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 12), align 8
945c39ec73SFlorian Hahn  store ptr @fn2, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 13), align 8
955c39ec73SFlorian Hahn  store ptr @fn3, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 14), align 8
965c39ec73SFlorian Hahn  store ptr @fn0, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 15), align 8
975c39ec73SFlorian Hahn  store ptr @fn1, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 16), align 8
985c39ec73SFlorian Hahn
99*2d69827cSNikita Popov  %l0 = load ptr, ptr @global.20ptr, align 8
1005c39ec73SFlorian Hahn  call void %l0()
1015c39ec73SFlorian Hahn  %l1 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 1), align 8
1025c39ec73SFlorian Hahn  call void %l1()
1035c39ec73SFlorian Hahn  %l2 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 2), align 8
1045c39ec73SFlorian Hahn  call void %l2()
1055c39ec73SFlorian Hahn  %l3 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 3), align 8
1065c39ec73SFlorian Hahn  call void %l3()
1075c39ec73SFlorian Hahn  %l4 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 4), align 8
1085c39ec73SFlorian Hahn  call void %l4()
1095c39ec73SFlorian Hahn  %l5 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 5), align 8
1105c39ec73SFlorian Hahn  call void %l5()
1115c39ec73SFlorian Hahn  %l6 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 6), align 8
1125c39ec73SFlorian Hahn  call void %l6()
1135c39ec73SFlorian Hahn  %l7 = load ptr, ptr @global.20ptr, align 8
1145c39ec73SFlorian Hahn  call void %l7()
1155c39ec73SFlorian Hahn  %l8 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 7), align 8
1165c39ec73SFlorian Hahn  call void %l8()
1175c39ec73SFlorian Hahn  %l9 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 8), align 8
1185c39ec73SFlorian Hahn  call void %l9()
1195c39ec73SFlorian Hahn  %l10 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 9), align 8
1205c39ec73SFlorian Hahn  call void %l10()
1215c39ec73SFlorian Hahn  %l11 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 10), align 8
1225c39ec73SFlorian Hahn  call void %l11()
1235c39ec73SFlorian Hahn  %l12 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 11), align 8
1245c39ec73SFlorian Hahn  call void %l12()
1255c39ec73SFlorian Hahn  %l13 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 12), align 8
1265c39ec73SFlorian Hahn  call void %l13()
1275c39ec73SFlorian Hahn  %l14 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 13), align 8
1285c39ec73SFlorian Hahn  call void %l14()
1295c39ec73SFlorian Hahn  %l15 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 14), align 8
1305c39ec73SFlorian Hahn  call void %l15()
1315c39ec73SFlorian Hahn  %l16 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 15), align 8
1325c39ec73SFlorian Hahn  call void %l16()
1335c39ec73SFlorian Hahn  %l17 = load ptr, ptr getelementptr inbounds (%struct.20ptr, ptr @global.20ptr, i64 0, i32 16), align 8
1345c39ec73SFlorian Hahn  call void %l17()
1355c39ec73SFlorian Hahn  ret void
1365c39ec73SFlorian Hahn}
137