diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -22010,10 +22010,9 @@ // the source vector. The high bits map to zero. We will use a zero vector // as the 2nd source operand of the shuffle, so use the 1st element of // that vector (mask value is number-of-elements) for the high bits. - if (i % ZextRatio == 0) - ShufMask[i] = Extract.getConstantOperandVal(1); - else - ShufMask[i] = NumMaskElts; + int Low = DAG.getDataLayout().isBigEndian() ? (ZextRatio - 1) : 0; + ShufMask[i] = (i % ZextRatio == Low) ? Extract.getConstantOperandVal(1) + : NumMaskElts; } // Undef elements of the build vector remain undef because we initialize diff --git a/llvm/test/CodeGen/PowerPC/pr61315.ll b/llvm/test/CodeGen/PowerPC/pr61315.ll --- a/llvm/test/CodeGen/PowerPC/pr61315.ll +++ b/llvm/test/CodeGen/PowerPC/pr61315.ll @@ -2,14 +2,6 @@ ; RUN: -mcpu=pwr9 -mtriple=powerpc64 < %s | FileCheck %s define dso_local <16 x i8> @ConvertExtractedMaskBitsToVect(<16 x i8> noundef %0) local_unnamed_addr #0 { ; CHECK: .LCPI0_0: -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 ; CHECK-NEXT: .byte 7 # 0x7 ; CHECK-NEXT: .byte 7 # 0x7 ; CHECK-NEXT: .byte 7 # 0x7 @@ -18,6 +10,14 @@ ; CHECK-NEXT: .byte 7 # 0x7 ; CHECK-NEXT: .byte 7 # 0x7 ; CHECK-NEXT: .byte 7 # 0x7 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 ; CHECK-LABEL: ConvertExtractedMaskBitsToVect: ; CHECK: # %bb.0: ; CHECK-NEXT: addis r3, r2, .LCPI0_0@toc@ha @@ -46,14 +46,6 @@ define dso_local <16 x i8> @ConvertExtractedMaskBitsToVect2(<16 x i8> noundef %0) local_unnamed_addr #0 { ; CHECK: .LCPI1_0: -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 16 # 0x10 ; CHECK-NEXT: .byte 7 # 0x7 ; CHECK-NEXT: .byte 7 # 0x7 ; CHECK-NEXT: .byte 7 # 0x7 @@ -62,6 +54,14 @@ ; CHECK-NEXT: .byte 7 # 0x7 ; CHECK-NEXT: .byte 7 # 0x7 ; CHECK-NEXT: .byte 7 # 0x7 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 ; CHECK-LABEL: ConvertExtractedMaskBitsToVect2: ; CHECK: # %bb.0: ; CHECK-NEXT: addis r3, r2, .LCPI1_0@toc@ha @@ -90,22 +90,22 @@ define dso_local <16 x i8> @ConvertExtractedMaskBitsToVect3(<8 x i16> noundef %0) local_unnamed_addr #0 { ; CHECK: .LCPI2_0: -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 17 # 0x11 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 17 # 0x11 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 17 # 0x11 -; CHECK-NEXT: .byte 16 # 0x10 -; CHECK-NEXT: .byte 17 # 0x11 -; CHECK-NEXT: .byte 6 # 0x6 -; CHECK-NEXT: .byte 6 # 0x6 -; CHECK-NEXT: .byte 6 # 0x6 -; CHECK-NEXT: .byte 6 # 0x6 -; CHECK-NEXT: .byte 6 # 0x6 -; CHECK-NEXT: .byte 6 # 0x6 -; CHECK-NEXT: .byte 6 # 0x6 -; CHECK-NEXT: .byte 6 # 0x6 +; CHECK-NEXT: .byte 6 # 0x6 +; CHECK-NEXT: .byte 7 # 0x7 +; CHECK-NEXT: .byte 6 # 0x6 +; CHECK-NEXT: .byte 7 # 0x7 +; CHECK-NEXT: .byte 6 # 0x6 +; CHECK-NEXT: .byte 7 # 0x7 +; CHECK-NEXT: .byte 6 # 0x6 +; CHECK-NEXT: .byte 7 # 0x7 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 +; CHECK-NEXT: .byte 16 # 0x10 ; CHECK-LABEL: ConvertExtractedMaskBitsToVect3: ; CHECK: # %bb.0: ; CHECK-NEXT: addis r3, r2, .LCPI2_0@toc@ha