[PATCH] D92668: [SLP]Merge reorder and reuse shuffles.

Jordan Rupprecht via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 28 15:20:50 PST 2020


rupprecht added a comment.

I think I'm seeing a miscompile as a result of the patch. The issue is not the transformation itself, but a dependent instruction is reading the wrong value.

Before this patch, we have this:

    %171 = load <2 x i32>, <2 x i32>* %114, align 8
    %reorder_shuffle = shufflevector <2 x i32> %171, <2 x i32> undef, <2 x i32> <i32 1, i32 0>
    %shuffle = shufflevector <2 x i32> %reorder_shuffle, <2 x i32> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
  ...
    %186 = add nsw <2 x i32> %reorder_shuffle, <i32 -1, i32 -1>

After this patch the same snippet looks like:

    %171 = load <2 x i32>, <2 x i32>* %114, align 8
    %shuffle = shufflevector <2 x i32> %171, <2 x i32> undef, <4 x i32> <i32 1, i32 0, i32 1, i32 0>
  ...
    %186 = add nsw <2 x i32> %171, <i32 -1, i32 -1>

IIUC, if we suppose `%171` loads the values `(a, b)`, then:

- In the original version, `%reorder_shuffle` is `(b, a)`, so `%186` is `(b - 1, a - 1)`
- In the modified version, `%186` reads directly from `%171`, so the result is `(a - 1, b - 1)`, which is swapped

Do you know what the issue might be? I'm trying to reduce the test case so I can share more details.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D92668/new/

https://reviews.llvm.org/D92668



More information about the llvm-commits mailing list