diff options
author | Nikita Popov <npopov@redhat.com> | 2022-05-11 12:11:11 +0200 |
---|---|---|
committer | Nikita Popov <npopov@redhat.com> | 2022-05-11 12:11:11 +0200 |
commit | c1bb4a881efe7d15083fd9a453c82d92ad663878 (patch) | |
tree | 2608af4830881ce256c347096aae1122dfd27a92 /llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp | |
parent | 36c3a9692ecbbad66bb63d1c75b7cc12d04493ad (diff) | |
download | llvm-c1bb4a881efe7d15083fd9a453c82d92ad663878.zip llvm-c1bb4a881efe7d15083fd9a453c82d92ad663878.tar.gz llvm-c1bb4a881efe7d15083fd9a453c82d92ad663878.tar.bz2 |
[SCEVExpander] Deduplicate min/max expansion code (NFC)
Diffstat (limited to 'llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp | 76 |
1 files changed, 12 insertions, 64 deletions
diff --git a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp index e6bfe6f..208bd84 100644 --- a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp +++ b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp @@ -1670,72 +1670,20 @@ Value *SCEVExpander::visitSignExtendExpr(const SCEVSignExtendExpr *S) { return Builder.CreateSExt(V, Ty); } -Value *SCEVExpander::expandSMaxExpr(const SCEVNAryExpr *S) { - Value *LHS = expand(S->getOperand(S->getNumOperands()-1)); - Type *Ty = LHS->getType(); - for (int i = S->getNumOperands()-2; i >= 0; --i) { - Value *RHS = expandCodeForImpl(S->getOperand(i), Ty, false); - Value *Sel; - if (Ty->isIntegerTy()) - Sel = Builder.CreateIntrinsic(Intrinsic::smax, {Ty}, {LHS, RHS}, - /*FMFSource=*/nullptr, "smax"); - else { - Value *ICmp = Builder.CreateICmpSGT(LHS, RHS); - Sel = Builder.CreateSelect(ICmp, LHS, RHS, "smax"); - } - LHS = Sel; - } - return LHS; -} - -Value *SCEVExpander::expandUMaxExpr(const SCEVNAryExpr *S) { - Value *LHS = expand(S->getOperand(S->getNumOperands()-1)); - Type *Ty = LHS->getType(); - for (int i = S->getNumOperands()-2; i >= 0; --i) { - Value *RHS = expandCodeForImpl(S->getOperand(i), Ty, false); - Value *Sel; - if (Ty->isIntegerTy()) - Sel = Builder.CreateIntrinsic(Intrinsic::umax, {Ty}, {LHS, RHS}, - /*FMFSource=*/nullptr, "umax"); - else { - Value *ICmp = Builder.CreateICmpUGT(LHS, RHS); - Sel = Builder.CreateSelect(ICmp, LHS, RHS, "umax"); - } - LHS = Sel; - } - return LHS; -} - -Value *SCEVExpander::expandSMinExpr(const SCEVNAryExpr *S) { - Value *LHS = expand(S->getOperand(S->getNumOperands() - 1)); - Type *Ty = LHS->getType(); - for (int i = S->getNumOperands() - 2; i >= 0; --i) { - Value *RHS = expandCodeForImpl(S->getOperand(i), Ty, false); - Value *Sel; - if (Ty->isIntegerTy()) - Sel = Builder.CreateIntrinsic(Intrinsic::smin, {Ty}, {LHS, RHS}, - /*FMFSource=*/nullptr, "smin"); - else { - Value *ICmp = Builder.CreateICmpSLT(LHS, RHS); - Sel = Builder.CreateSelect(ICmp, LHS, RHS, "smin"); - } - LHS = Sel; - } - return LHS; -} - -Value *SCEVExpander::expandUMinExpr(const SCEVNAryExpr *S) { +Value *SCEVExpander::expandMinMaxExpr(const SCEVNAryExpr *S, + Intrinsic::ID IntrinID, Twine Name) { Value *LHS = expand(S->getOperand(S->getNumOperands() - 1)); Type *Ty = LHS->getType(); for (int i = S->getNumOperands() - 2; i >= 0; --i) { Value *RHS = expandCodeForImpl(S->getOperand(i), Ty, false); Value *Sel; if (Ty->isIntegerTy()) - Sel = Builder.CreateIntrinsic(Intrinsic::umin, {Ty}, {LHS, RHS}, - /*FMFSource=*/nullptr, "umin"); + Sel = Builder.CreateIntrinsic(IntrinID, {Ty}, {LHS, RHS}, + /*FMFSource=*/nullptr, Name); else { - Value *ICmp = Builder.CreateICmpULT(LHS, RHS); - Sel = Builder.CreateSelect(ICmp, LHS, RHS, "umin"); + Value *ICmp = + Builder.CreateICmp(MinMaxIntrinsic::getPredicate(IntrinID), LHS, RHS); + Sel = Builder.CreateSelect(ICmp, LHS, RHS, Name); } LHS = Sel; } @@ -1743,19 +1691,19 @@ Value *SCEVExpander::expandUMinExpr(const SCEVNAryExpr *S) { } Value *SCEVExpander::visitSMaxExpr(const SCEVSMaxExpr *S) { - return expandSMaxExpr(S); + return expandMinMaxExpr(S, Intrinsic::smax, "smax"); } Value *SCEVExpander::visitUMaxExpr(const SCEVUMaxExpr *S) { - return expandUMaxExpr(S); + return expandMinMaxExpr(S, Intrinsic::umax, "umax"); } Value *SCEVExpander::visitSMinExpr(const SCEVSMinExpr *S) { - return expandSMinExpr(S); + return expandMinMaxExpr(S, Intrinsic::smin, "smin"); } Value *SCEVExpander::visitUMinExpr(const SCEVUMinExpr *S) { - return expandUMinExpr(S); + return expandMinMaxExpr(S, Intrinsic::umin, "umin"); } Value *SCEVExpander::visitSequentialUMinExpr(const SCEVSequentialUMinExpr *S) { @@ -1772,7 +1720,7 @@ Value *SCEVExpander::visitSequentialUMinExpr(const SCEVSequentialUMinExpr *S) { Value *AnyOpIsZero = Builder.CreateLogicalOr(OpIsZero); - Value *NaiveUMin = expandUMinExpr(S); + Value *NaiveUMin = expandMinMaxExpr(S, Intrinsic::umin, "umin"); return Builder.CreateSelect(AnyOpIsZero, SaturationPoint, NaiveUMin); } |