Skip to content

Commit 372efd5

Browse files
committed
Add a new overload of SILInstruction::getOperandValues to get
transformed values of the operands
1 parent c7fe393 commit 372efd5

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

include/swift/SIL/SILInstruction.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,12 +523,20 @@ class SILInstruction
523523
private:
524524
/// Predicate used to filter OperandValueRange.
525525
struct OperandToValue;
526+
/// Predicate used to filter TransformedOperandValueRange.
527+
struct OperandToTransformedValue;
526528

527529
public:
528530
using OperandValueRange =
529531
OptionalTransformRange<ArrayRef<Operand>, OperandToValue>;
532+
using TransformedOperandValueRange =
533+
OptionalTransformRange<ArrayRef<Operand>, OperandToTransformedValue>;
534+
530535
OperandValueRange
531536
getOperandValues(bool skipTypeDependentOperands = false) const;
537+
TransformedOperandValueRange
538+
getOperandValues(std::function<SILValue(SILValue)> transformFn,
539+
bool skipTypeDependentOperands) const;
532540

533541
SILValue getOperand(unsigned Num) const {
534542
return getAllOperands()[Num].get();
@@ -727,13 +735,40 @@ struct SILInstruction::OperandToValue {
727735
}
728736
};
729737

738+
struct SILInstruction::OperandToTransformedValue {
739+
const SILInstruction &i;
740+
std::function<SILValue(SILValue)> transformFn;
741+
bool skipTypeDependentOps;
742+
743+
OperandToTransformedValue(const SILInstruction &i,
744+
std::function<SILValue(SILValue)> transformFn,
745+
bool skipTypeDependentOps)
746+
: i(i), transformFn(transformFn),
747+
skipTypeDependentOps(skipTypeDependentOps) {}
748+
749+
Optional<SILValue> operator()(const Operand &use) const {
750+
if (skipTypeDependentOps && i.isTypeDependentOperand(use))
751+
return None;
752+
return transformFn(use.get());
753+
}
754+
};
755+
730756
inline auto
731757
SILInstruction::getOperandValues(bool skipTypeDependentOperands) const
732758
-> OperandValueRange {
733759
return OperandValueRange(getAllOperands(),
734760
OperandToValue(*this, skipTypeDependentOperands));
735761
}
736762

763+
inline auto
764+
SILInstruction::getOperandValues(std::function<SILValue(SILValue)> transformFn,
765+
bool skipTypeDependentOperands) const
766+
-> TransformedOperandValueRange {
767+
return TransformedOperandValueRange(
768+
getAllOperands(),
769+
OperandToTransformedValue(*this, transformFn, skipTypeDependentOperands));
770+
}
771+
737772
struct SILInstruction::OperandToType {
738773
const SILInstruction &i;
739774

0 commit comments

Comments
 (0)