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