[PATCH] D97382: NFC: Migrate PartialInlining to work on InstructionCost
Christopher Tetreault via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 26 12:20:18 PST 2021
ctetreau added inline comments.
================
Comment at: llvm/include/llvm/Support/InstructionCost.h:117
+ template <typename T,
+ typename = std::enable_if_t<std::is_floating_point<T>::value>>
----------------
sdesmalen wrote:
> ctetreau wrote:
> > sdesmalen wrote:
> > > ctetreau wrote:
> > > > why is this necessary?
> > > I wasn't really sure what type to choose for RHS (`float` or `double`), so I thought I'd just template the type for any floating point type.
> > >
> > > The operator is needed for a multiplication in PartialInlining with the options `MinRegionSizeRatio` and `ColdBranchRatio` which in this case are both of type `float`.
> > It looks like in all cases where those two options are used, they are immediately static_cast<int>'ed before being assigned to anything. Could you just keep the static cast and not have this operator overload?
> >
> > My fear is that we're going to end up with a billion operator overloads that are only used in one or two places.
> Just to make sure we're on the same page, the instance for which I added this operator is:
> InstructionCost MinOutlineRegionCost =
> OverallFunctionCost * MinRegionSizeRatio.getValue();
> where `OverallFunctionCost` is now an InstructionCost.
>
> In my previous comment I suggested `ColdBranchRatio` was also used in a computation with InstructionCost, but that was not correct (that is the one being static_cast'ed to int).
>
> The alternative way to write this is to check for validity and ask the for the value, multiply with the FP value, and return a new InstructionCost.
Oh, I see the issue. Instead of providing overloads for float, you could add a map function like Optional has:
```
// F is a function from CostType to CostType
template <class Function>
InstructionCost map(const Function &F) const {
if (isValid())
return F(*getValue());
return getInvalid();
}
```
Then you could have:
```
InstructionCost MinOutlineRegionCost = OverallFunctionCost.map(
[&](auto OFC) { return OFC * MinRegionSizeRatio; });
```
(I guess you could delegate to Optional<InstructionCost::CostType>::map, but I don't think that would save any keystrokes)
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D97382/new/
https://reviews.llvm.org/D97382
More information about the llvm-commits
mailing list