diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 11e8740d2f509f..47422035ee897b 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -6359,6 +6359,12 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) { case Intrinsic::smin: return getSMinExpr(getSCEV(II->getArgOperand(0)), getSCEV(II->getArgOperand(1))); + case Intrinsic::usub_sat: { + const SCEV *X = getSCEV(II->getArgOperand(0)); + const SCEV *Y = getSCEV(II->getArgOperand(1)); + const SCEV *ClampedY = getUMinExpr(X, Y); + return getMinusSCEV(X, ClampedY, SCEV::FlagNUW); + } default: break; } diff --git a/llvm/test/Analysis/ScalarEvolution/saturating-intrinsics.ll b/llvm/test/Analysis/ScalarEvolution/saturating-intrinsics.ll index b49cc710892ad7..0a054eea14914f 100644 --- a/llvm/test/Analysis/ScalarEvolution/saturating-intrinsics.ll +++ b/llvm/test/Analysis/ScalarEvolution/saturating-intrinsics.ll @@ -35,7 +35,7 @@ define i32 @usub_sat(i32 %x, i32 %y) { ; CHECK-LABEL: 'usub_sat' ; CHECK-NEXT: Classifying expressions for: @usub_sat ; CHECK-NEXT: %z = call i32 @llvm.usub.sat.i32(i32 %x, i32 %y) -; CHECK-NEXT: --> %z U: full-set S: full-set +; CHECK-NEXT: --> ((-1 * (%x umin %y)) + %x) U: full-set S: full-set ; CHECK-NEXT: Determining loop execution counts for: @usub_sat ; %z = call i32 @llvm.usub.sat.i32(i32 %x, i32 %y)