[PATCH] [AArch64] Fix non-determinism in A57 FP Load Balancing

James Molloy james at jamesmolloy.co.uk
Wed Jan 28 12:00:47 PST 2015


Hi Sanjin,

Are you sure we don't need the uniqueness property of a set any more?

If not, SetVector seems like the right solution.

James
On Wed, 28 Jan 2015 at 18:48, Sanjin Sijaric <ssijaric at codeaurora.org>
wrote:

> Hi jmolloy, Jiangning, t.p.northover,
>
> Change the type of AllChains from std::set<unique_ptr<Chain>> to
> std::vector<unique_ptr<Chain>>, as traversing pointers contained in
> std::set doesn't guarantee a well-defined order.  We have observed
> differences in register assignment in .s files produced with the exact same
> build.  I don't see that duplicate entries can be added to AllChains, so it
> should be safe to replace std::set with std::vector.  This way, traversal
> of AllChains will be well defined.
>
> Example debug output with -debug-only=aarch64-a57-fp-load-balancing
> resulting in different traversal:
>
> Compile #1:
>
>     colorChainSet(): #sets=4
>    - Parity=2, Color=Odd
>    - colorChain({%S19<def> = FMULSrr -> %S19<def> = FMULSrr}, Odd)
>    - Scavenged register: S3
>    - Destination register not changed.
>    - Parity=1, Color=Odd
>    - {%S18<def> = FMULSrr -> %S18<def> = FMULSrr} - not worthwhile
> changing; color remains Even
>    - colorChain({%S18<def> = FMULSrr -> %S18<def> = FMULSrr}, Even)
>    - Scavenged register: S2
>    - Destination register not changed.
>    - Parity=2, Color=Odd
>    - colorChain({%S6<def> = FMULSrr -> %S6<def> = FMULSrr (kill @
> %S18<def> = FMULSrr)}, Odd)
>    - Scavenged register: S3
>    - Kill instruction seen.
>    - Parity=1, Color=Odd
>    - colorChain({%S16<def> = FMULSrr -> %S16<def> = FMULSrr (kill @
> %S19<def> = FMULSrr)}, Odd)
>    - Scavenged register: S5
>    - Kill instruction seen.
>
> Compile #2:
>
>   colorChainSet(): #sets=4
>  - Parity=2, Color=Odd
>  - colorChain({%S19<def> = FMULSrr -> %S19<def> = FMULSrr}, Odd)
>  - Scavenged register: S3
>  - Destination register not changed.
>  - Parity=1, Color=Odd
>  - {%S18<def> = FMULSrr -> %S18<def> = FMULSrr} - not worthwhile changing;
> color remains Even
>  - colorChain({%S18<def> = FMULSrr -> %S18<def> = FMULSrr}, Even)
>  - Scavenged register: S2
>  - Destination register not changed.
>  - Parity=2, Color=Odd
>  - colorChain({%S16<def> = FMULSrr -> %S16<def> = FMULSrr (kill @
> %S19<def> = FMULSrr)}, Odd)
>  - Scavenged register: S3
>  - Kill instruction seen.
>  - Parity=1, Color=Odd
>  - colorChain({%S6<def> = FMULSrr -> %S6<def> = FMULSrr (kill @ %S18<def>
> = FMULSrr)}, Odd)
>  - Scavenged register: S5
>  - Kill instruction seen.
>
> Cannot have a reproducible test case for this.
>
> http://reviews.llvm.org/D7231
>
> Files:
>   lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp
>
> Index: lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp
> ===================================================================
> --- lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp
> +++ lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp
> @@ -137,7 +137,7 @@
>    int scavengeRegister(Chain *G, Color C, MachineBasicBlock &MBB);
>    void scanInstruction(MachineInstr *MI, unsigned Idx,
>                         std::map<unsigned, Chain*> &Active,
> -                       std::set<std::unique_ptr<Chain>> &AllChains);
> +                       std::vector<std::unique_ptr<Chain>> &AllChains);
>    void maybeKillChain(MachineOperand &MO, unsigned Idx,
>                        std::map<unsigned, Chain*> &RegChains);
>    Color getColor(unsigned Register);
> @@ -320,7 +320,7 @@
>    // been killed yet. This is keyed by register - all chains can only
> have one
>    // "link" register between each inst in the chain.
>    std::map<unsigned, Chain*> ActiveChains;
> -  std::set<std::unique_ptr<Chain>> AllChains;
> +  std::vector<std::unique_ptr<Chain>> AllChains;
>    unsigned Idx = 0;
>    for (auto &MI : MBB)
>      scanInstruction(&MI, Idx++, ActiveChains, AllChains);
> @@ -583,7 +583,7 @@
>  void AArch64A57FPLoadBalancing::
>  scanInstruction(MachineInstr *MI, unsigned Idx,
>                  std::map<unsigned, Chain*> &ActiveChains,
> -                std::set<std::unique_ptr<Chain>> &AllChains) {
> +                std::vector<std::unique_ptr<Chain>> &AllChains) {
>    // Inspect "MI", updating ActiveChains and AllChains.
>
>    if (isMul(MI)) {
> @@ -602,7 +602,7 @@
>
>      auto G = llvm::make_unique<Chain>(MI, Idx, getColor(DestReg));
>      ActiveChains[DestReg] = G.get();
> -    AllChains.insert(std::move(G));
> +    AllChains.push_back(std::move(G));
>
>    } else if (isMla(MI)) {
>
> @@ -646,7 +646,7 @@
>            << TRI->getName(DestReg) << "\n");
>      auto G = llvm::make_unique<Chain>(MI, Idx, getColor(DestReg));
>      ActiveChains[DestReg] = G.get();
> -    AllChains.insert(std::move(G));
> +    AllChains.push_back(std::move(G));
>
>    } else {
>
> EMAIL PREFERENCES
>   http://reviews.llvm.org/settings/panel/emailpreferences/
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150128/6ccb6fe4/attachment.html>


More information about the llvm-commits mailing list