@@ -1927,33 +1927,18 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
1927
1927
// Canonicalize smax(smin(X, MinC), MaxC) to smin(smax(X, MaxC), MinC)
1928
1928
// if MinC s>= MaxC.
1929
1929
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)));
1957
1942
}
1958
1943
}
1959
1944
}
0 commit comments