Index: lib/Target/PowerPC/PPCISelLowering.cpp =================================================================== --- lib/Target/PowerPC/PPCISelLowering.cpp +++ lib/Target/PowerPC/PPCISelLowering.cpp @@ -10566,6 +10566,20 @@ (LoadVT == MVT::v2f64 || LoadVT == MVT::v2i64 || LoadVT == MVT::v4f32 || LoadVT == MVT::v4i32)) return expandVSXLoadForLE(N, DCI); + + // When we load a v4i8, the code can degrade rather quickly. Convert + // this to an i32 load and bitcast. + if (LoadVT == MVT::v4i8) { + SDValue ScalarLoad = DAG.getLoad(MVT::i32, dl, LD->getChain(), + LD->getBasePtr(), LD->getPointerInfo(), + false, LD->isNonTemporal(), + LD->isInvariant(), LD->getAlignment(), + LD->getAAInfo()); + SDValue BitCast = DAG.getBitcast(MVT::v4i8, ScalarLoad); + return DAG.getNode(ISD::MERGE_VALUES, dl, + DAG.getVTList(MVT::v4i8, MVT::Other), + BitCast, ScalarLoad.getValue(1)); + } } // We sometimes end up with a 64-bit integer load, from which we extract