diff --git a/llvm/include/llvm/Support/DivisionByConstantInfo.h b/llvm/include/llvm/Support/DivisionByConstantInfo.h --- a/llvm/include/llvm/Support/DivisionByConstantInfo.h +++ b/llvm/include/llvm/Support/DivisionByConstantInfo.h @@ -31,7 +31,7 @@ bool AllowEvenDivisorOptimization = true); APInt Magic; ///< magic number bool IsAdd; ///< add indicator - unsigned ShiftAmount; ///< shift amount + unsigned PostShift; ///< post-shift amount unsigned PreShift; ///< pre-shift amount }; diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp --- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp @@ -4962,16 +4962,14 @@ Magic = std::move(magics.Magic); - if (!magics.IsAdd) { - assert(magics.ShiftAmount < Divisor.getBitWidth() && - "We shouldn't generate an undefined shift!"); - PostShift = magics.ShiftAmount; - PreShift = magics.PreShift; - } else { - assert(magics.PreShift == 0 && "Unexpected pre-shift"); - PostShift = magics.ShiftAmount - 1; - SelNPQ = true; - } + assert(magics.PreShift < Divisor.getBitWidth() && + "We shouldn't generate an undefined shift!"); + assert(magics.PostShift < Divisor.getBitWidth() && + "We shouldn't generate an undefined shift!"); + assert((!magics.IsAdd || magics.PreShift == 0) && "Unexpected pre-shift"); + PreShift = magics.PreShift; + PostShift = magics.PostShift; + SelNPQ = magics.IsAdd; } PreShifts.push_back( diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -6056,16 +6056,15 @@ Magic = std::move(magics.Magic); - if (!magics.IsAdd) { - assert(magics.ShiftAmount < Divisor.getBitWidth() && - "We shouldn't generate an undefined shift!"); - PostShift = magics.ShiftAmount; - PreShift = magics.PreShift; - } else { - assert(magics.PreShift == 0 && "Unexpected pre-shift"); - PostShift = magics.ShiftAmount - 1; - SelNPQ = true; - } + assert(magics.PreShift < Divisor.getBitWidth() && + "We shouldn't generate an undefined shift!"); + assert(magics.PostShift < Divisor.getBitWidth() && + "We shouldn't generate an undefined shift!"); + assert((!magics.IsAdd || magics.PreShift == 0) && + "Unexpected pre-shift"); + PreShift = magics.PreShift; + PostShift = magics.PostShift; + SelNPQ = magics.IsAdd; } PreShifts.push_back(DAG.getConstant(PreShift, dl, ShSVT)); diff --git a/llvm/lib/Support/DivisionByConstantInfo.cpp b/llvm/lib/Support/DivisionByConstantInfo.cpp --- a/llvm/lib/Support/DivisionByConstantInfo.cpp +++ b/llvm/lib/Support/DivisionByConstantInfo.cpp @@ -143,7 +143,12 @@ Retval.Magic = std::move(Q2); // resulting magic number ++Retval.Magic; - Retval.ShiftAmount = P - D.getBitWidth(); // resulting shift + Retval.PostShift = P - D.getBitWidth(); // resulting shift + // Reduce shift amount for IsAdd. + if (Retval.IsAdd) { + assert(Retval.PostShift > 0 && "Unexpected shift"); + Retval.PostShift -= 1; + } Retval.PreShift = 0; return Retval; } diff --git a/llvm/unittests/Support/DivisionByConstantTest.cpp b/llvm/unittests/Support/DivisionByConstantTest.cpp --- a/llvm/unittests/Support/DivisionByConstantTest.cpp +++ b/llvm/unittests/Support/DivisionByConstantTest.cpp @@ -116,22 +116,14 @@ } } - unsigned PreShift = 0; - unsigned PostShift = 0; - bool UseNPQ = false; - if (!Magics.IsAdd) { - assert(Magics.ShiftAmount < Divisor.getBitWidth() && - "We shouldn't generate an undefined shift!"); - PreShift = Magics.PreShift; - PostShift = Magics.ShiftAmount; - UseNPQ = false; - } else { - assert(Magics.PreShift == 0 && "Unexpected pre-shift"); - PostShift = Magics.ShiftAmount - 1; - assert(PostShift < Divisor.getBitWidth() && - "We shouldn't generate an undefined shift!"); - UseNPQ = true; - } + assert(Magics.PreShift < Divisor.getBitWidth() && + "We shouldn't generate an undefined shift!"); + assert(Magics.PostShift < Divisor.getBitWidth() && + "We shouldn't generate an undefined shift!"); + assert((!Magics.IsAdd || Magics.PreShift == 0) && "Unexpected pre-shift"); + unsigned PreShift = Magics.PreShift; + unsigned PostShift = Magics.PostShift; + bool UseNPQ = Magics.IsAdd; APInt NPQFactor = UseNPQ ? APInt::getSignedMinValue(Bits) : APInt::getZero(Bits);