@@ -567,19 +567,30 @@ class SILInstruction : public llvm::ilist_node<SILInstruction> {
567
567
bool maySuspend () const ;
568
568
569
569
private:
570
- // / Predicate used to filter OperandValueRange.
570
+ // / Functor for Operand::get()
571
571
struct OperandToValue ;
572
- // / Predicate used to filter TransformedOperandValueRange.
572
+ // / Functor for Operand::get()
573
+ struct OperandRefToValue ;
574
+ // / Predicate to filter NonTypeDependentOperandValueRange
575
+ struct NonTypeDependentOperandToValue ;
576
+ // / Predicate to filter TransformedOperandValueRange.
573
577
struct OperandToTransformedValue ;
574
578
575
579
public:
576
- using OperandValueRange =
577
- OptionalTransformRange<ArrayRef<Operand>, OperandToValue>;
580
+ using OperandValueRange = TransformRange<ArrayRef<Operand*>, OperandToValue>;
581
+ using OperandRefValueRange =
582
+ TransformRange<ArrayRef<Operand>, OperandRefToValue>;
583
+ using NonTypeDependentOperandValueRange =
584
+ OptionalTransformRange<ArrayRef<Operand>, NonTypeDependentOperandToValue>;
578
585
using TransformedOperandValueRange =
579
- OptionalTransformRange<ArrayRef<Operand>, OperandToTransformedValue>;
586
+ OptionalTransformRange<ArrayRef<Operand>, OperandToTransformedValue>;
587
+
588
+ static OperandValueRange getOperandValues (ArrayRef<Operand*> operands);
589
+
590
+ OperandRefValueRange getOperandValues () const ;
591
+
592
+ NonTypeDependentOperandValueRange getNonTypeDependentOperandValues () const ;
580
593
581
- OperandValueRange
582
- getOperandValues (bool skipTypeDependentOperands = false ) const ;
583
594
TransformedOperandValueRange
584
595
getOperandValues (std::function<SILValue(SILValue)> transformFn,
585
596
bool skipTypeDependentOperands) const ;
@@ -879,14 +890,24 @@ inline const SILNode *SILNode::instAsNode(const SILInstruction *inst) {
879
890
880
891
881
892
struct SILInstruction ::OperandToValue {
893
+ SILValue operator ()(const Operand *use) const {
894
+ return use->get ();
895
+ }
896
+ };
897
+
898
+ struct SILInstruction ::OperandRefToValue {
899
+ SILValue operator ()(const Operand &use) const {
900
+ return use.get ();
901
+ }
902
+ };
903
+
904
+ struct SILInstruction ::NonTypeDependentOperandToValue {
882
905
const SILInstruction &i;
883
- bool skipTypeDependentOps;
884
906
885
- OperandToValue (const SILInstruction &i, bool skipTypeDependentOps)
886
- : i(i), skipTypeDependentOps(skipTypeDependentOps) {}
907
+ NonTypeDependentOperandToValue (const SILInstruction &i): i(i) {}
887
908
888
909
Optional<SILValue> operator ()(const Operand &use) const {
889
- if (skipTypeDependentOps && i.isTypeDependentOperand (use))
910
+ if (i.isTypeDependentOperand (use))
890
911
return None;
891
912
return use.get ();
892
913
}
@@ -910,11 +931,21 @@ struct SILInstruction::OperandToTransformedValue {
910
931
}
911
932
};
912
933
934
+ inline SILInstruction::OperandValueRange
935
+ SILInstruction::getOperandValues (ArrayRef<Operand*> operands) {
936
+ return OperandValueRange (operands, OperandToValue ());
937
+ }
938
+
939
+ inline auto
940
+ SILInstruction::getOperandValues () const -> OperandRefValueRange {
941
+ return OperandRefValueRange (getAllOperands (), OperandRefToValue ());
942
+ }
943
+
913
944
inline auto
914
- SILInstruction::getOperandValues ( bool skipTypeDependentOperands ) const
915
- -> OperandValueRange {
916
- return OperandValueRange (getAllOperands (),
917
- OperandToValue (*this , skipTypeDependentOperands ));
945
+ SILInstruction::getNonTypeDependentOperandValues ( ) const
946
+ -> NonTypeDependentOperandValueRange {
947
+ return NonTypeDependentOperandValueRange (getAllOperands (),
948
+ NonTypeDependentOperandToValue (*this ));
918
949
}
919
950
920
951
inline auto
0 commit comments