[llvm] feat: fix big endian shuffle vector miscompile (PR #68673)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 10 04:07:47 PDT 2023
================
@@ -10914,6 +10914,26 @@ SDValue AArch64TargetLowering::ReconstructShuffle(SDValue Op,
SDValue Shuffle = DAG.getVectorShuffle(ShuffleVT, dl, ShuffleOps[0],
ShuffleOps[1], Mask);
+ if (DAG.getDataLayout().isBigEndian()) {
+ EVT SrcEltTy = ShuffleVT.getVectorElementType();
+ EVT DstEltTy = VT.getVectorElementType();
+ if (SrcEltTy != DstEltTy) {
+ unsigned REVOp = 0;
+ unsigned DstTypeSize = DstEltTy.getFixedSizeInBits();
+ unsigned SrcTypeSize = SrcEltTy.getFixedSizeInBits();
+ if (std::max(DstTypeSize, SrcTypeSize) == 16) {
+ REVOp = AArch64ISD::REV16;
+ } else if (std::max(DstTypeSize, SrcTypeSize) == 32) {
+ REVOp = AArch64ISD::REV32;
+ } else if (std::max(DstTypeSize, SrcTypeSize) == 64) {
+ REVOp = AArch64ISD::REV64;
+ }
+ if (REVOp) {
+ Shuffle = DAG.getNode(REVOp, dl, ShuffleVT, Shuffle);
+ }
+ }
+ }
+
SDValue V = DAG.getNode(ISD::BITCAST, dl, VT, Shuffle);
----------------
hstk30-hw wrote:
To be honest, I didn't take NVCAST into account :(
Do you have relative test case?
I will see it later.
https://github.com/llvm/llvm-project/pull/68673
More information about the llvm-commits
mailing list