diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h --- a/llvm/include/llvm/CodeGen/SelectionDAG.h +++ b/llvm/include/llvm/CodeGen/SelectionDAG.h @@ -2263,7 +2263,8 @@ } /// Set PCSections to be associated with Node. void addPCSections(const SDNode *Node, MDNode *MD) { - SDEI[Node].PCSections = MD; + SmallPtrSet Visited; + addPCSections(Node, MD, Visited); } /// Return PCSections associated with Node, or nullptr if none exists. MDNode *getPCSections(const SDNode *Node) const { @@ -2341,6 +2342,10 @@ SDNode *FindNodeOrInsertPos(const FoldingSetNodeID &ID, const SDLoc &DL, void *&InsertPos); + /// Recursively set PCSections to be associated with Node and all its values. + void addPCSections(const SDNode *Node, MDNode *MD, + SmallPtrSet &Visited); + /// Maps to auto-CSE operations. std::vector CondCodeNodes; diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -1363,6 +1363,19 @@ return N; } +void SelectionDAG::addPCSections( + const SDNode *Node, MDNode *MD, + SmallPtrSet &Visited) { + // If we've been here before, return now. + if (!Visited.insert(Node).second) + return; + + SDEI[Node].PCSections = MD; + + for (const SDValue &Op : Node->op_values()) + addPCSections(Op.getNode(), MD, Visited); +} + void SelectionDAG::clear() { allnodes_clear(); OperandRecycler.clear(OperandAllocator); diff --git a/llvm/test/CodeGen/AArch64/pcsections.ll b/llvm/test/CodeGen/AArch64/pcsections.ll --- a/llvm/test/CodeGen/AArch64/pcsections.ll +++ b/llvm/test/CodeGen/AArch64/pcsections.ll @@ -2,7 +2,7 @@ ; RUN: llc -O1 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-OPT,DEFCM ; RUN: llc -O2 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-OPT,DEFCM ; RUN: llc -O3 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-OPT,DEFCM -; RUN: llc -O1 -code-model=large < %s | FileCheck %s --check-prefixes=CHECK,CHECK-OPT,LARGE +; RUN: llc -O1 -code-model=large < %s | FileCheck %s --check-prefixes=CHECK,LARGE target triple = "aarch64-unknown-linux-gnu" @@ -14,24 +14,61 @@ ; CHECK: .Lfunc_begin0: ; CHECK: // %bb.0: // %entry ; CHECK: .Lpcsection0: +; -- +; LARGE-NEXT: movz +; LARGE: .Lpcsection1: +; LARGE-NEXT: movk +; LARGE: .Lpcsection2: +; LARGE-NEXT: movk +; LARGE: .Lpcsection3: +; LARGE-NEXT: movk +; LARGE: .Lpcsection4: +; -- ; CHECK-NEXT: ldr ; CHECK-NEXT: ret ; CHECK: .section section_no_aux,"awo",@progbits,.text -; CHECK-NEXT: .Lpcsection_base0: +; -- +; DEFCM-NEXT: .Lpcsection_base0: ; DEFCM-NEXT: .word .Lfunc_begin0-.Lpcsection_base0 -; LARGE-NEXT: .xword .Lfunc_begin0-.Lpcsection_base0 -; CHECK-NEXT: .word .Lfunc_end0-.Lfunc_begin0 -; CHECK-NEXT: .section section_aux_42,"awo",@progbits,.text -; CHECK-NEXT: .Lpcsection_base1: +; DEFCM-NEXT: .word .Lfunc_end0-.Lfunc_begin0 +; DEFCM-NEXT: .section section_aux_42,"awo",@progbits,.text +; DEFCM-NEXT: .Lpcsection_base1: ; DEFCM-NEXT: .word .Lpcsection0-.Lpcsection_base1 -; LARGE-NEXT: .xword .Lpcsection0-.Lpcsection_base1 -; CHECK-NEXT: .word 42 -; CHECK-NEXT: .section section_aux_21264,"awo",@progbits,.text -; CHECK-NEXT: .Lpcsection_base2: +; DEFCM-NEXT: .word 42 +; DEFCM-NEXT: .section section_aux_21264,"awo",@progbits,.text +; DEFCM-NEXT: .Lpcsection_base2: ; DEFCM-NEXT: .word .Lpcsection0-.Lpcsection_base2 -; LARGE-NEXT: .xword .Lpcsection0-.Lpcsection_base2 -; CHECK-NEXT: .word 21264 -; CHECK-NEXT: .text +; DEFCM-NEXT: .word 21264 +; -- +; LARGE-NEXT: .Lpcsection_base0: +; LARGE-NEXT: .xword .Lfunc_begin0-.Lpcsection_base0 +; LARGE-NEXT: .word .Lfunc_end0-.Lfunc_begin0 +; LARGE-NEXT: .section section_aux_42,"awo",@progbits,.text +; LARGE-NEXT: .Lpcsection_base1: +; LARGE-NEXT: .xword .Lpcsection0-.Lpcsection_base1 +; LARGE-NEXT: .Lpcsection_base2: +; LARGE-NEXT: .xword .Lpcsection1-.Lpcsection_base2 +; LARGE-NEXT: .Lpcsection_base3: +; LARGE-NEXT: .xword .Lpcsection2-.Lpcsection_base3 +; LARGE-NEXT: .Lpcsection_base4: +; LARGE-NEXT: .xword .Lpcsection3-.Lpcsection_base4 +; LARGE-NEXT: .Lpcsection_base5: +; LARGE-NEXT: .xword .Lpcsection4-.Lpcsection_base5 +; LARGE-NEXT: .word 42 +; LARGE-NEXT: .section section_aux_21264,"awo",@progbits,.text +; LARGE-NEXT: .Lpcsection_base6: +; LARGE-NEXT: .xword .Lpcsection0-.Lpcsection_base6 +; LARGE-NEXT: .Lpcsection_base7: +; LARGE-NEXT: .xword .Lpcsection1-.Lpcsection_base7 +; LARGE-NEXT: .Lpcsection_base8: +; LARGE-NEXT: .xword .Lpcsection2-.Lpcsection_base8 +; LARGE-NEXT: .Lpcsection_base9: +; LARGE-NEXT: .xword .Lpcsection3-.Lpcsection_base9 +; LARGE-NEXT: .Lpcsection_base10: +; LARGE-NEXT: .xword .Lpcsection4-.Lpcsection_base10 +; LARGE-NEXT: .word 21264 +; -- +; CHECK-NEXT: .text entry: %0 = load i64, ptr @bar, align 8, !pcsections !1 ret i64 %0 @@ -39,16 +76,46 @@ define i64 @test_simple_atomic() { ; CHECK-LABEL: test_simple_atomic: -; CHECK: .Lpcsection1: -; CHECK-NEXT: ldr -; CHECK-NOT: .Lpcsection2 -; CHECK: ldr +; -- +; DEFCM: .Lpcsection1: +; DEFCM-NEXT: ldr +; DEFCM-NOT: .Lpcsection2 +; DEFCM: ldr +; -- +; LARGE: .Lpcsection5: +; LARGE-NEXT: movz +; LARGE-NEXT: movz +; LARGE: .Lpcsection6: +; LARGE-NEXT: movk +; LARGE-NEXT: movk +; LARGE: .Lpcsection7: +; LARGE-NEXT: movk +; LARGE-NEXT: movk +; LARGE: .Lpcsection8: +; LARGE-NEXT: movk +; LARGE-NEXT: movk +; LARGE: .Lpcsection9: +; LARGE-NEXT: ldr +; LARGE-NEXT: ldr +; -- ; CHECK: add ; CHECK-NEXT: ret ; CHECK: .section section_no_aux,"awo",@progbits,.text -; CHECK-NEXT: .Lpcsection_base3: +; -- +; DEFCM-NEXT: .Lpcsection_base3: ; DEFCM-NEXT: .word .Lpcsection1-.Lpcsection_base3 -; LARGE-NEXT: .xword .Lpcsection1-.Lpcsection_base3 +; -- +; LARGE-NEXT: .Lpcsection_base11: +; LARGE-NEXT: .xword .Lpcsection5-.Lpcsection_base11 +; LARGE-NEXT: .Lpcsection_base12: +; LARGE-NEXT: .xword .Lpcsection6-.Lpcsection_base12 +; LARGE-NEXT: .Lpcsection_base13: +; LARGE-NEXT: .xword .Lpcsection7-.Lpcsection_base13 +; LARGE-NEXT: .Lpcsection_base14: +; LARGE-NEXT: .xword .Lpcsection8-.Lpcsection_base14 +; LARGE-NEXT: .Lpcsection_base15: +; LARGE-NEXT: .xword .Lpcsection9-.Lpcsection_base15 +; -- ; CHECK-NEXT: .text entry: %0 = load atomic i64, ptr @foo monotonic, align 8, !pcsections !0 @@ -84,23 +151,78 @@ ; CHECK-UNOPT: .Lpcsection13: ; CHECK-UNOPT-NEXT: b ; --- +; LARGE: .Lpcsection10: +; LARGE-NEXT: movz +; LARGE-NEXT: .Lpcsection11: +; LARGE-NEXT: movk +; LARGE-NEXT: .Lpcsection12: +; LARGE-NEXT: movk +; LARGE-NEXT: .Lpcsection13: +; LARGE-NEXT: movk +; LARGE: .Lpcsection14: +; LARGE-NEXT: ldxr +; LARGE-NEXT: .Lpcsection15: +; LARGE-NEXT: add +; LARGE-NEXT: .Lpcsection16: +; LARGE-NEXT: stxr +; LARGE-NEXT: .Lpcsection17: +; LARGE-NEXT: cbnz +; --- ; CHECK-NOT: .Lpcsection ; CHECK: ldr ; CHECK: ret ; CHECK: .section section_no_aux,"awo",@progbits,.text -; CHECK-NEXT: .Lpcsection_base4: -; DEFCM-NEXT: .word .Lpcsection2-.Lpcsection_base4 -; LARGE-NEXT: .xword .Lpcsection2-.Lpcsection_base4 -; CHECK-NEXT: .Lpcsection_base5: -; DEFCM-NEXT: .word .Lpcsection3-.Lpcsection_base5 -; LARGE-NEXT: .xword .Lpcsection3-.Lpcsection_base5 -; CHECK-NEXT: .Lpcsection_base6: -; DEFCM-NEXT: .word .Lpcsection4-.Lpcsection_base6 -; LARGE-NEXT: .xword .Lpcsection4-.Lpcsection_base6 -; CHECK-NEXT: .Lpcsection_base7: -; DEFCM-NEXT: .word .Lpcsection5-.Lpcsection_base7 -; LARGE-NEXT: .xword .Lpcsection5-.Lpcsection_base7 -; CHECK-UNOPT: .word .Lpcsection13-.Lpcsection_base15 +; --- +; CHECK-OPT-NEXT: .Lpcsection_base4: +; CHECK-OPT-NEXT: .word .Lpcsection2-.Lpcsection_base4 +; CHECK-OPT-NEXT: .Lpcsection_base5: +; CHECK-OPT-NEXT: .word .Lpcsection3-.Lpcsection_base5 +; CHECK-OPT-NEXT: .Lpcsection_base6: +; CHECK-OPT-NEXT: .word .Lpcsection4-.Lpcsection_base6 +; CHECK-OPT-NEXT: .Lpcsection_base7: +; CHECK-OPT-NEXT: .word .Lpcsection5-.Lpcsection_base7 +; --- +; CHECK-UNOPT-NEXT: .Lpcsection_base4: +; CHECK-UNOPT-NEXT: .word .Lpcsection2-.Lpcsection_base4 +; CHECK-UNOPT-NEXT: .Lpcsection_base5: +; CHECK-UNOPT-NEXT: .word .Lpcsection3-.Lpcsection_base5 +; CHECK-UNOPT-NEXT: .Lpcsection_base6: +; CHECK-UNOPT-NEXT: .word .Lpcsection4-.Lpcsection_base6 +; CHECK-UNOPT-NEXT: .Lpcsection_base7: +; CHECK-UNOPT-NEXT: .word .Lpcsection5-.Lpcsection_base7 +; CHECK-UNOPT-NEXT: .Lpcsection_base8: +; CHECK-UNOPT-NEXT: .word .Lpcsection6-.Lpcsection_base8 +; CHECK-UNOPT-NEXT: .Lpcsection_base9: +; CHECK-UNOPT-NEXT: .word .Lpcsection7-.Lpcsection_base9 +; CHECK-UNOPT-NEXT: .Lpcsection_base10: +; CHECK-UNOPT-NEXT: .word .Lpcsection8-.Lpcsection_base10 +; CHECK-UNOPT-NEXT: .Lpcsection_base11: +; CHECK-UNOPT-NEXT: .word .Lpcsection9-.Lpcsection_base11 +; CHECK-UNOPT-NEXT: .Lpcsection_base12: +; CHECK-UNOPT-NEXT: .word .Lpcsection10-.Lpcsection_base12 +; CHECK-UNOPT-NEXT: .Lpcsection_base13: +; CHECK-UNOPT-NEXT: .word .Lpcsection11-.Lpcsection_base13 +; CHECK-UNOPT-NEXT: .Lpcsection_base14: +; CHECK-UNOPT-NEXT: .word .Lpcsection12-.Lpcsection_base14 +; CHECK-UNOPT-NEXT: .Lpcsection_base15: +; CHECK-UNOPT-NEXT: .word .Lpcsection13-.Lpcsection_base15 +; --- +; LARGE-NEXT: .Lpcsection_base16: +; LARGE-NEXT: .xword .Lpcsection10-.Lpcsection_base16 +; LARGE-NEXT: .Lpcsection_base17: +; LARGE-NEXT: .xword .Lpcsection11-.Lpcsection_base17 +; LARGE-NEXT: .Lpcsection_base18: +; LARGE-NEXT: .xword .Lpcsection12-.Lpcsection_base18 +; LARGE-NEXT: .Lpcsection_base19: +; LARGE-NEXT: .xword .Lpcsection13-.Lpcsection_base19 +; LARGE-NEXT: .Lpcsection_base20: +; LARGE-NEXT: .xword .Lpcsection14-.Lpcsection_base20 +; LARGE-NEXT: .Lpcsection_base21: +; LARGE-NEXT: .xword .Lpcsection15-.Lpcsection_base21 +; LARGE-NEXT: .Lpcsection_base22: +; LARGE-NEXT: .xword .Lpcsection16-.Lpcsection_base22 +; LARGE-NEXT: .Lpcsection_base23: +; LARGE-NEXT: .xword .Lpcsection17-.Lpcsection_base23 ; CHECK-NEXT: .text entry: %0 = atomicrmw add ptr @foo, i64 1 monotonic, align 8, !pcsections !0 diff --git a/llvm/test/CodeGen/X86/pcsections.ll b/llvm/test/CodeGen/X86/pcsections.ll --- a/llvm/test/CodeGen/X86/pcsections.ll +++ b/llvm/test/CodeGen/X86/pcsections.ll @@ -48,25 +48,47 @@ ; CHECK-LABEL: multiple: ; CHECK-NEXT: .Lfunc_begin2 ; CHECK: # %bb.0: # %entry -; CHECK: .Lpcsection0: -; CHECK-NEXT: movq +; -- +; DEFCM: .Lpcsection0: +; DEFCM-NEXT: movq +; -- +; LARGE: .Lpcsection0: +; LARGE-NEXT: movabsq +; LARGE-NEXT: .Lpcsection1: +; LARGE-NEXT: movq +; -- ; CHECK-NEXT: retq ; CHECK-NEXT: .Lfunc_end2: -; CHECK: .section section_no_aux,"awo",@progbits,.text -; CHECK-NEXT: .Lpcsection_base2: -; DEFCM-NEXT: .long .Lfunc_begin2-.Lpcsection_base2 -; LARGE-NEXT: .quad .Lfunc_begin2-.Lpcsection_base2 -; CHECK-NEXT: .long .Lfunc_end2-.Lfunc_begin2 -; CHECK-NEXT: .section section_aux_42,"awo",@progbits,.text -; CHECK-NEXT: .Lpcsection_base3: -; DEFCM-NEXT: .long .Lpcsection0-.Lpcsection_base3 -; LARGE-NEXT: .quad .Lpcsection0-.Lpcsection_base3 -; CHECK-NEXT: .long 42 -; CHECK-NEXT: .section section_aux_21264,"awo",@progbits,.text -; CHECK-NEXT: .Lpcsection_base4: -; DEFCM-NEXT: .long .Lpcsection0-.Lpcsection_base4 -; LARGE-NEXT: .quad .Lpcsection0-.Lpcsection_base4 -; CHECK-NEXT: .long 21264 +; CHECK: .section section_no_aux,"awo",@progbits,.text +; -- +; DEFCM-NEXT: .Lpcsection_base2: +; DEFCM-NEXT: .long .Lfunc_begin2-.Lpcsection_base2 +; DEFCM-NEXT: .long .Lfunc_end2-.Lfunc_begin2 +; DEFCM-NEXT: .section section_aux_42,"awo",@progbits,.text +; DEFCM-NEXT: .Lpcsection_base3: +; DEFCM-NEXT: .long .Lpcsection0-.Lpcsection_base3 +; DEFCM-NEXT: .long 42 +; DEFCM-NEXT: .section section_aux_21264,"awo",@progbits,.text +; DEFCM-NEXT: .Lpcsection_base4: +; DEFCM-NEXT: .long .Lpcsection0-.Lpcsection_base4 +; DEFCM-NEXT: .long 21264 +; -- +; LARGE: .Lpcsection_base2: +; LARGE-NEXT: .quad .Lfunc_begin2-.Lpcsection_base2 +; LARGE-NEXT: .long .Lfunc_end2-.Lfunc_begin2 +; LARGE-NEXT: .section section_aux_42,"awo",@progbits,.text +; LARGE-NEXT: .Lpcsection_base3: +; LARGE-NEXT: .quad .Lpcsection0-.Lpcsection_base3 +; LARGE-NEXT: .Lpcsection_base4: +; LARGE-NEXT: .quad .Lpcsection1-.Lpcsection_base4 +; LARGE-NEXT: .long 42 +; LARGE-NEXT: .section section_aux_21264,"awo",@progbits,.text +; LARGE-NEXT: .Lpcsection_base5: +; LARGE-NEXT: .quad .Lpcsection0-.Lpcsection_base5 +; LARGE-NEXT: .Lpcsection_base6: +; LARGE-NEXT: .quad .Lpcsection1-.Lpcsection_base6 +; LARGE-NEXT: .long 21264 +; -- ; CHECK-NEXT: .text entry: %0 = load i64, ptr @bar, align 8, !pcsections !2 @@ -75,16 +97,29 @@ define i64 @test_simple_atomic() { ; CHECK-LABEL: test_simple_atomic: -; CHECK: .Lpcsection1: -; CHECK-NEXT: movq +; -- +; DEFCM: .Lpcsection1: +; DEFCM-NEXT: movq +; -- +; LARGE: .Lpcsection2: +; LARGE-NEXT: movabsq +; LARGE-NEXT: .Lpcsection3: +; LARGE-NEXT: movq +; -- ; CHECK-NOT: .Lpcsection ; CHECK: addq ; CHECK-NEXT: retq ; CHECK-NEXT: .Lfunc_end3: -; CHECK: .section section_no_aux,"awo",@progbits,.text -; CHECK-NEXT: .Lpcsection_base5: -; DEFCM-NEXT: .long .Lpcsection1-.Lpcsection_base5 -; LARGE-NEXT: .quad .Lpcsection1-.Lpcsection_base5 +; CHECK: .section section_no_aux,"awo",@progbits,.text +; -- +; DEFCM-NEXT: .Lpcsection_base5: +; DEFCM-NEXT: .long .Lpcsection1-.Lpcsection_base5 +; -- +; LARGE-NEXT: .Lpcsection_base7: +; LARGE-NEXT: .quad .Lpcsection2-.Lpcsection_base7 +; LARGE-NEXT: .Lpcsection_base8: +; LARGE-NEXT: .quad .Lpcsection3-.Lpcsection_base8 +; -- ; CHECK-NEXT: .text entry: %0 = load atomic i64, ptr @foo monotonic, align 8, !pcsections !0 @@ -95,18 +130,38 @@ define i64 @test_complex_atomic() { ; CHECK-LABEL: test_complex_atomic: -; CHECK: movl $1 -; CHECK-NEXT: .Lpcsection2: -; CHECK-NEXT: lock xaddq +; -- +; DEFCM: .Lpcsection2: +; DEFCM-NEXT: movl +; DEFCM-NEXT: .Lpcsection3: +; DEFCM-NEXT: lock +; -- +; LARGE: .Lpcsection4: +; LARGE-NEXT: movabsq +; LARGE-NEXT: .Lpcsection5: +; LARGE-NEXT: movl +; LARGE-NEXT: .Lpcsection6: +; LARGE-NEXT: lock +; -- ; CHECK-NOT: .Lpcsection ; CHECK: movq ; CHECK: addq ; CHECK: retq ; CHECK-NEXT: .Lfunc_end4: -; CHECK: .section section_no_aux,"awo",@progbits,.text -; CHECK-NEXT: .Lpcsection_base6: -; DEFCM-NEXT: .long .Lpcsection2-.Lpcsection_base6 -; LARGE-NEXT: .quad .Lpcsection2-.Lpcsection_base6 +; CHECK: .section section_no_aux,"awo",@progbits,.text +; -- +; DEFCM-NEXT: .Lpcsection_base6: +; DEFCM-NEXT: .long .Lpcsection2-.Lpcsection_base6 +; DEFCM-NEXT: .Lpcsection_base7: +; DEFCM-NEXT: .long .Lpcsection3-.Lpcsection_base7 +; -- +; LARGE-NEXT: .Lpcsection_base9: +; LARGE-NEXT: .quad .Lpcsection4-.Lpcsection_base9 +; LARGE-NEXT: .Lpcsection_base10: +; LARGE-NEXT: .quad .Lpcsection5-.Lpcsection_base10 +; LARGE-NEXT: .Lpcsection_base11: +; LARGE-NEXT: .quad .Lpcsection6-.Lpcsection_base11 +; -- ; CHECK-NEXT: .text entry: %0 = atomicrmw add ptr @foo, i64 1 monotonic, align 8, !pcsections !0