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