mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-04 06:09:05 +00:00
[x86] Fix another miscompile found through fuzz testing the new vector
shuffle lowering. This is closely related to the previous one. Here we failed to use the source offset when swapping in the other case -- where we end up swapping the *final* shuffle. The cause of this bug is a bit different: I simply wasn't thinking about the fact that this mask is actually a slice of a wide mask and thus has numbers that need SourceOffset applied. Simple fix. Would be even more simple with an algorithm-y thing to use here, but correctness first. =] git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215095 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0651861b7b
commit
0e89fbb120
@ -7546,10 +7546,10 @@ static SDValue lowerV8I16SingleInputVectorShuffle(
|
||||
// We also have to update the final source mask in this case because
|
||||
// it may need to undo the above swap.
|
||||
for (int &M : FinalSourceHalfMask)
|
||||
if (M == (InputsFixed[0] ^ 1))
|
||||
M = InputsFixed[1];
|
||||
else if (M == InputsFixed[1])
|
||||
M = InputsFixed[0] ^ 1;
|
||||
if (M == (InputsFixed[0] ^ 1) + SourceOffset)
|
||||
M = InputsFixed[1] + SourceOffset;
|
||||
else if (M == InputsFixed[1] + SourceOffset)
|
||||
M = InputsFixed[0] ^ 1 + SourceOffset;
|
||||
|
||||
InputsFixed[1] = InputsFixed[0] ^ 1;
|
||||
}
|
||||
|
@ -238,6 +238,23 @@ define <8 x i16> @shuffle_v8i16_66751643(<8 x i16> %a, <8 x i16> %b) {
|
||||
ret <8 x i16> %shuffle
|
||||
}
|
||||
|
||||
define <8 x i16> @shuffle_v8i16_60514754(<8 x i16> %a, <8 x i16> %b) {
|
||||
; SSE2-LABEL: @shuffle_v8i16_60514754
|
||||
; SSE2: # BB#0:
|
||||
; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,5,4,7]
|
||||
; SSE2-NEXT: pshufd {{.*}} # xmm0 = xmm0[0,2,2,3]
|
||||
; SSE2-NEXT: pshuflw {{.*}} # xmm0 = xmm0[2,0,3,1,4,5,6,7]
|
||||
; SSE2-NEXT: pshufhw {{.*}} # xmm0 = xmm0[0,1,2,3,6,7,5,6]
|
||||
; SSE2-NEXT: retq
|
||||
;
|
||||
; SSSE3-LABEL: @shuffle_v8i16_60514754
|
||||
; SSSE3: # BB#0:
|
||||
; SSSE3-NEXT: pshufb {{.*}} # xmm0 = xmm0[12,13,0,1,10,11,2,3,8,9,14,15,10,11,8,9]
|
||||
; SSSE3-NEXT: retq
|
||||
%shuffle = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 6, i32 0, i32 5, i32 1, i32 4, i32 7, i32 5, i32 4>
|
||||
ret <8 x i16> %shuffle
|
||||
}
|
||||
|
||||
define <8 x i16> @shuffle_v8i16_00444444(<8 x i16> %a, <8 x i16> %b) {
|
||||
; SSE2-LABEL: @shuffle_v8i16_00444444
|
||||
; SSE2: # BB#0:
|
||||
|
Loading…
Reference in New Issue
Block a user