[llvm] r215611 - [SDAG] Fix a case where we would iteratively legalize a node during

Nick Lewycky nlewycky at google.com
Fri Aug 22 17:57:47 PDT 2014


This introduced a very slow compile or infinite loop problem described in
llvm.org/PR20736 so I have reverted it in r216307.

Nick


On 13 August 2014 18:07, Chandler Carruth <chandlerc at gmail.com> wrote:

> Author: chandlerc
> Date: Wed Aug 13 20:07:37 2014
> New Revision: 215611
>
> URL: http://llvm.org/viewvc/llvm-project?rev=215611&view=rev
> Log:
> [SDAG] Fix a case where we would iteratively legalize a node during
> combining by replacing it with something else but not re-process the
> node afterward to remove it.
>
> In a truly remarkable stroke of bad luck, this would (in the test case
> attached) end up getting some other node combined into it without ever
> getting re-processed. By adding it back on to the worklist, in addition
> to deleting the dead nodes more quickly we also ensure that if it
> *stops* being dead for any reason it makes it back through the
> legalizer. Without this, the test case will end up failing during
> instruction selection due to an and node with a type we don't have an
> instruction pattern for.
>
> It took many million runs of the shuffle fuzz tester to find this.
>
> Modified:
>     llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
>     llvm/trunk/test/CodeGen/X86/vector-shuffle-128-v16.ll
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=215611&r1=215610&r2=215611&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Wed Aug 13
> 20:07:37 2014
> @@ -156,6 +156,8 @@ public:
>    // Node replacement helpers
>    void ReplacedNode(SDNode *N) {
>      LegalizedNodes.erase(N);
> +    if (UpdatedNodes)
> +      UpdatedNodes->insert(N);
>    }
>    void ReplaceNode(SDNode *Old, SDNode *New) {
>      DEBUG(dbgs() << " ... replacing: "; Old->dump(&DAG);
>
> Modified: llvm/trunk/test/CodeGen/X86/vector-shuffle-128-v16.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/vector-shuffle-128-v16.ll?rev=215611&r1=215610&r2=215611&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/vector-shuffle-128-v16.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/vector-shuffle-128-v16.ll Wed Aug 13
> 20:07:37 2014
> @@ -269,3 +269,23 @@ define <16 x i8> @trunc_v4i32_shuffle(<1
>    %shuffle = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32
> 0, i32 4, i32 8, i32 12, i32 undef, i32 undef, i32 undef, i32 undef, i32
> undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef,
> i32 undef>
>    ret <16 x i8> %shuffle
>  }
> +
> +define <16 x i8> @stress_test0(<16 x i8> %s.0.1, <16 x i8> %s.0.2, <16 x
> i8> %s.0.3, <16 x i8> %s.0.4, <16 x i8> %s.0.5, <16 x i8> %s.0.6, <16 x i8>
> %s.0.7, <16 x i8> %s.0.8, <16 x i8> %s.0.9) {
> +; We don't have anything useful to check here. This generates 100s of
> +; instructions. Instead, just make sure we survived codegen.
> +;
> +; ALL-LABEL: @stress_test0
> +; ALL: retq
> +entry:
> +  %s.1.4 = shufflevector <16 x i8> %s.0.4, <16 x i8> %s.0.5, <16 x i32>
> <i32 1, i32 22, i32 21, i32 28, i32 3, i32 16, i32 6, i32 1, i32 19, i32
> 29, i32 12, i32 31, i32 2, i32 3, i32 3, i32 6>
> +  %s.1.5 = shufflevector <16 x i8> %s.0.5, <16 x i8> %s.0.6, <16 x i32>
> <i32 31, i32 20, i32 12, i32 19, i32 2, i32 15, i32 12, i32 31, i32 2, i32
> 28, i32 2, i32 30, i32 7, i32 8, i32 17, i32 28>
> +  %s.1.8 = shufflevector <16 x i8> %s.0.8, <16 x i8> %s.0.9, <16 x i32>
> <i32 14, i32 10, i32 17, i32 5, i32 17, i32 9, i32 17, i32 21, i32 31, i32
> 24, i32 16, i32 6, i32 20, i32 28, i32 23, i32 8>
> +  %s.2.2 = shufflevector <16 x i8> %s.0.3, <16 x i8> %s.0.4, <16 x i32>
> <i32 20, i32 9, i32 21, i32 11, i32 11, i32 4, i32 3, i32 18, i32 3, i32
> 30, i32 4, i32 31, i32 11, i32 24, i32 13, i32 29>
> +  %s.3.2 = shufflevector <16 x i8> %s.2.2, <16 x i8> %s.1.4, <16 x i32>
> <i32 15, i32 13, i32 5, i32 11, i32 7, i32 17, i32 14, i32 22, i32 22, i32
> 16, i32 7, i32 24, i32 16, i32 22, i32 7, i32 29>
> +  %s.5.4 = shufflevector <16 x i8> %s.1.5, <16 x i8> %s.1.8, <16 x i32>
> <i32 3, i32 13, i32 19, i32 7, i32 23, i32 11, i32 1, i32 9, i32 16, i32
> 25, i32 2, i32 7, i32 0, i32 21, i32 23, i32 17>
> +  %s.6.1 = shufflevector <16 x i8> %s.3.2, <16 x i8> %s.3.2, <16 x i32>
> <i32 11, i32 2, i32 28, i32 31, i32 27, i32 3, i32 9, i32 27, i32 25, i32
> 25, i32 14, i32 7, i32 12, i32 28, i32 12, i32 23>
> +  %s.7.1 = shufflevector <16 x i8> %s.6.1, <16 x i8> %s.3.2, <16 x i32>
> <i32 15, i32 29, i32 14, i32 0, i32 29, i32 15, i32 26, i32 30, i32 6, i32
> 7, i32 2, i32 8, i32 12, i32 10, i32 29, i32 17>
> +  %s.7.2 = shufflevector <16 x i8> %s.3.2, <16 x i8> %s.5.4, <16 x i32>
> <i32 3, i32 29, i32 3, i32 19, i32 undef, i32 20, i32 undef, i32 3, i32 27,
> i32 undef, i32 undef, i32 11, i32 undef, i32 undef, i32 undef, i32 undef>
> +  %s.16.0 = shufflevector <16 x i8> %s.7.1, <16 x i8> %s.7.2, <16 x i32>
> <i32 13, i32 1, i32 16, i32 16, i32 6, i32 7, i32 29, i32 18, i32 19, i32
> 28, i32 undef, i32 undef, i32 31, i32 1, i32 undef, i32 10>
> +  ret <16 x i8> %s.16.0
> +}
>
>
> _______________________________________________
> 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/20140822/58022c6d/attachment.html>


More information about the llvm-commits mailing list