@@ -1927,33 +1927,18 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
19271927 // Canonicalize smax(smin(X, MinC), MaxC) to smin(smax(X, MaxC), MinC)
19281928 // if MinC s>= MaxC.
19291929 if (IID == Intrinsic::smax) {
1930- Constant *MinC, *MaxC;
1931- if (match (I0, m_OneUse (m_Intrinsic<Intrinsic::smin>(
1932- m_Value (X), m_ImmConstant (MinC)))) &&
1933- match (I1, m_ImmConstant (MaxC))) {
1934-
1935- bool MinSgeMax = false ;
1936-
1937- ConstantInt *MinCI = dyn_cast<ConstantInt>(MinC);
1938- ConstantInt *MaxCI = dyn_cast<ConstantInt>(MaxC);
1939- if (MinCI && MaxCI && MinCI->getValue ().sge (MaxCI->getValue ())) {
1940- MinSgeMax = true ;
1941- } else if (MinC->getType ()->isVectorTy ()) {
1942- ConstantInt *MinSplat =
1943- dyn_cast_or_null<ConstantInt>(MinC->getSplatValue ());
1944- ConstantInt *MaxSplat =
1945- dyn_cast_or_null<ConstantInt>(MaxC->getSplatValue ());
1946- if (MinSplat && MaxSplat &&
1947- MinSplat->getValue ().sge (MaxSplat->getValue ())) {
1948- MinSgeMax = true ;
1949- }
1950- }
1951-
1952- if (MinSgeMax) {
1953- Value *NewSMax =
1954- Builder.CreateBinaryIntrinsic (Intrinsic::smax, X, MaxC);
1955- return replaceInstUsesWith (*II, Builder.CreateBinaryIntrinsic (
1956- Intrinsic::smin, NewSMax, MinC));
1930+ const APInt *MinC, *MaxC;
1931+ if (match (I0, m_OneUse (m_Intrinsic<Intrinsic::smin>(m_Value (X),
1932+ m_APInt (MinC)))) &&
1933+ match (I1, m_APInt (MaxC))) {
1934+
1935+ if (MinC->sgt (*MaxC)) {
1936+ Value *NewSMax = Builder.CreateBinaryIntrinsic (
1937+ Intrinsic::smax, X, ConstantInt::get (X->getType (), *MaxC));
1938+ return replaceInstUsesWith (
1939+ *II, Builder.CreateBinaryIntrinsic (
1940+ Intrinsic::smin, NewSMax,
1941+ ConstantInt::get (X->getType (), *MinC)));
19571942 }
19581943 }
19591944 }
0 commit comments