diff --git a/llvm/include/llvm/CodeGen/TargetSubtargetInfo.h b/llvm/include/llvm/CodeGen/TargetSubtargetInfo.h --- a/llvm/include/llvm/CodeGen/TargetSubtargetInfo.h +++ b/llvm/include/llvm/CodeGen/TargetSubtargetInfo.h @@ -297,6 +297,9 @@ /// possible. virtual bool enableSubRegLiveness() const { return false; } + /// Enable coalescing of subregister. + virtual bool enableJoinSubRange() const { return false; } + /// This is called after a .mir file was loaded. virtual void mirFileLoaded(MachineFunction &MF) const; diff --git a/llvm/lib/CodeGen/RegisterCoalescer.cpp b/llvm/lib/CodeGen/RegisterCoalescer.cpp --- a/llvm/lib/CodeGen/RegisterCoalescer.cpp +++ b/llvm/lib/CodeGen/RegisterCoalescer.cpp @@ -3346,10 +3346,11 @@ LiveInterval &RHS = LIS->getInterval(CP.getSrcReg()); LiveInterval &LHS = LIS->getInterval(CP.getDstReg()); bool TrackSubRegLiveness = MRI->shouldTrackSubRegLiveness(*CP.getNewRC()); + bool JoinSubRange = MF->getSubtarget().enableJoinSubRange(); JoinVals RHSVals(RHS, CP.getSrcReg(), CP.getSrcIdx(), LaneBitmask::getNone(), - NewVNInfo, CP, LIS, TRI, false, TrackSubRegLiveness); + NewVNInfo, CP, LIS, TRI, JoinSubRange, TrackSubRegLiveness); JoinVals LHSVals(LHS, CP.getDstReg(), CP.getDstIdx(), LaneBitmask::getNone(), - NewVNInfo, CP, LIS, TRI, false, TrackSubRegLiveness); + NewVNInfo, CP, LIS, TRI, JoinSubRange, TrackSubRegLiveness); LLVM_DEBUG(dbgs() << "\t\tRHS = " << RHS << "\n\t\tLHS = " << LHS << '\n');