Add a new overload of SILInstruction::getOperandValues to get

transformed values of the operands
This commit is contained in:
Meghana Gupta
2020-12-17 14:44:03 -08:00
parent c7fe3933d2
commit 372efd5a76

View File

@@ -523,12 +523,20 @@ public:
private: private:
/// Predicate used to filter OperandValueRange. /// Predicate used to filter OperandValueRange.
struct OperandToValue; struct OperandToValue;
/// Predicate used to filter TransformedOperandValueRange.
struct OperandToTransformedValue;
public: public:
using OperandValueRange = using OperandValueRange =
OptionalTransformRange<ArrayRef<Operand>, OperandToValue>; OptionalTransformRange<ArrayRef<Operand>, OperandToValue>;
using TransformedOperandValueRange =
OptionalTransformRange<ArrayRef<Operand>, OperandToTransformedValue>;
OperandValueRange OperandValueRange
getOperandValues(bool skipTypeDependentOperands = false) const; getOperandValues(bool skipTypeDependentOperands = false) const;
TransformedOperandValueRange
getOperandValues(std::function<SILValue(SILValue)> transformFn,
bool skipTypeDependentOperands) const;
SILValue getOperand(unsigned Num) const { SILValue getOperand(unsigned Num) const {
return getAllOperands()[Num].get(); return getAllOperands()[Num].get();
@@ -727,6 +735,24 @@ struct SILInstruction::OperandToValue {
} }
}; };
struct SILInstruction::OperandToTransformedValue {
const SILInstruction &i;
std::function<SILValue(SILValue)> transformFn;
bool skipTypeDependentOps;
OperandToTransformedValue(const SILInstruction &i,
std::function<SILValue(SILValue)> transformFn,
bool skipTypeDependentOps)
: i(i), transformFn(transformFn),
skipTypeDependentOps(skipTypeDependentOps) {}
Optional<SILValue> operator()(const Operand &use) const {
if (skipTypeDependentOps && i.isTypeDependentOperand(use))
return None;
return transformFn(use.get());
}
};
inline auto inline auto
SILInstruction::getOperandValues(bool skipTypeDependentOperands) const SILInstruction::getOperandValues(bool skipTypeDependentOperands) const
-> OperandValueRange { -> OperandValueRange {
@@ -734,6 +760,15 @@ SILInstruction::getOperandValues(bool skipTypeDependentOperands) const
OperandToValue(*this, skipTypeDependentOperands)); OperandToValue(*this, skipTypeDependentOperands));
} }
inline auto
SILInstruction::getOperandValues(std::function<SILValue(SILValue)> transformFn,
bool skipTypeDependentOperands) const
-> TransformedOperandValueRange {
return TransformedOperandValueRange(
getAllOperands(),
OperandToTransformedValue(*this, transformFn, skipTypeDependentOperands));
}
struct SILInstruction::OperandToType { struct SILInstruction::OperandToType {
const SILInstruction &i; const SILInstruction &i;