Changeset View
Changeset View
Standalone View
Standalone View
flang/lib/Optimizer/Dialect/FIROps.cpp
Show First 20 Lines • Show All 991 Lines • ▼ Show 20 Lines | |||||
static constexpr llvm::StringRef getCompareOffsetAttr() { | static constexpr llvm::StringRef getCompareOffsetAttr() { | ||||
return "compare_operand_offsets"; | return "compare_operand_offsets"; | ||||
} | } | ||||
static constexpr llvm::StringRef getTargetOffsetAttr() { | static constexpr llvm::StringRef getTargetOffsetAttr() { | ||||
return "target_operand_offsets"; | return "target_operand_offsets"; | ||||
} | } | ||||
template <typename A> | template <typename A, typename... AdditionalArgs> | ||||
static A getSubOperands(unsigned pos, A allArgs, | static A getSubOperands(unsigned pos, A allArgs, | ||||
mlir::DenseIntElementsAttr ranges) { | mlir::DenseIntElementsAttr ranges, | ||||
AdditionalArgs &&... additionalArgs) { | |||||
unsigned start = 0; | unsigned start = 0; | ||||
for (unsigned i = 0; i < pos; ++i) | for (unsigned i = 0; i < pos; ++i) | ||||
start += (*(ranges.begin() + i)).getZExtValue(); | start += (*(ranges.begin() + i)).getZExtValue(); | ||||
unsigned end = start + (*(ranges.begin() + pos)).getZExtValue(); | return allArgs.slice(start, (*(ranges.begin() + pos)).getZExtValue(), | ||||
return {std::next(allArgs.begin(), start), std::next(allArgs.begin(), end)}; | std::forward<AdditionalArgs>(additionalArgs)...); | ||||
} | |||||
static mlir::MutableOperandRange | |||||
getMutableSuccessorOperands(unsigned pos, mlir::MutableOperandRange operands, | |||||
StringRef offsetAttr) { | |||||
Operation *owner = operands.getOwner(); | |||||
NamedAttribute targetOffsetAttr = | |||||
*owner->getMutableAttrDict().getNamed(offsetAttr); | |||||
return getSubOperands( | |||||
pos, operands, targetOffsetAttr.second.cast<DenseIntElementsAttr>(), | |||||
mlir::MutableOperandRange::OperandSegment(pos, targetOffsetAttr)); | |||||
} | } | ||||
static unsigned denseElementsSize(mlir::DenseIntElementsAttr attr) { | static unsigned denseElementsSize(mlir::DenseIntElementsAttr attr) { | ||||
return attr.getNumElements(); | return attr.getNumElements(); | ||||
} | } | ||||
llvm::Optional<mlir::OperandRange> fir::SelectOp::getCompareOperands(unsigned) { | llvm::Optional<mlir::OperandRange> fir::SelectOp::getCompareOperands(unsigned) { | ||||
return {}; | return {}; | ||||
} | } | ||||
llvm::Optional<llvm::ArrayRef<mlir::Value>> | llvm::Optional<llvm::ArrayRef<mlir::Value>> | ||||
fir::SelectOp::getCompareOperands(llvm::ArrayRef<mlir::Value>, unsigned) { | fir::SelectOp::getCompareOperands(llvm::ArrayRef<mlir::Value>, unsigned) { | ||||
return {}; | return {}; | ||||
} | } | ||||
llvm::Optional<mlir::OperandRange> | llvm::Optional<mlir::MutableOperandRange> | ||||
fir::SelectOp::getSuccessorOperands(unsigned oper) { | fir::SelectOp::getMutableSuccessorOperands(unsigned oper) { | ||||
auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr()); | return ::getMutableSuccessorOperands(oper, targetArgsMutable(), | ||||
return {getSubOperands(oper, targetArgs(), a)}; | getTargetOffsetAttr()); | ||||
} | } | ||||
llvm::Optional<llvm::ArrayRef<mlir::Value>> | llvm::Optional<llvm::ArrayRef<mlir::Value>> | ||||
fir::SelectOp::getSuccessorOperands(llvm::ArrayRef<mlir::Value> operands, | fir::SelectOp::getSuccessorOperands(llvm::ArrayRef<mlir::Value> operands, | ||||
unsigned oper) { | unsigned oper) { | ||||
auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr()); | auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr()); | ||||
auto segments = | auto segments = | ||||
getAttrOfType<mlir::DenseIntElementsAttr>(getOperandSegmentSizeAttr()); | getAttrOfType<mlir::DenseIntElementsAttr>(getOperandSegmentSizeAttr()); | ||||
return {getSubOperands(oper, getSubOperands(2, operands, segments), a)}; | return {getSubOperands(oper, getSubOperands(2, operands, segments), a)}; | ||||
} | } | ||||
bool fir::SelectOp::canEraseSuccessorOperand() { return true; } | |||||
unsigned fir::SelectOp::targetOffsetSize() { | unsigned fir::SelectOp::targetOffsetSize() { | ||||
return denseElementsSize( | return denseElementsSize( | ||||
getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr())); | getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr())); | ||||
} | } | ||||
//===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||
// SelectCaseOp | // SelectCaseOp | ||||
//===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||
llvm::Optional<mlir::OperandRange> | llvm::Optional<mlir::OperandRange> | ||||
fir::SelectCaseOp::getCompareOperands(unsigned cond) { | fir::SelectCaseOp::getCompareOperands(unsigned cond) { | ||||
auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getCompareOffsetAttr()); | auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getCompareOffsetAttr()); | ||||
return {getSubOperands(cond, compareArgs(), a)}; | return {getSubOperands(cond, compareArgs(), a)}; | ||||
} | } | ||||
llvm::Optional<llvm::ArrayRef<mlir::Value>> | llvm::Optional<llvm::ArrayRef<mlir::Value>> | ||||
fir::SelectCaseOp::getCompareOperands(llvm::ArrayRef<mlir::Value> operands, | fir::SelectCaseOp::getCompareOperands(llvm::ArrayRef<mlir::Value> operands, | ||||
unsigned cond) { | unsigned cond) { | ||||
auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getCompareOffsetAttr()); | auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getCompareOffsetAttr()); | ||||
auto segments = | auto segments = | ||||
getAttrOfType<mlir::DenseIntElementsAttr>(getOperandSegmentSizeAttr()); | getAttrOfType<mlir::DenseIntElementsAttr>(getOperandSegmentSizeAttr()); | ||||
return {getSubOperands(cond, getSubOperands(1, operands, segments), a)}; | return {getSubOperands(cond, getSubOperands(1, operands, segments), a)}; | ||||
} | } | ||||
llvm::Optional<mlir::OperandRange> | llvm::Optional<mlir::MutableOperandRange> | ||||
fir::SelectCaseOp::getSuccessorOperands(unsigned oper) { | fir::SelectCaseOp::getMutableSuccessorOperands(unsigned oper) { | ||||
auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr()); | return ::getMutableSuccessorOperands(oper, targetArgsMutable(), | ||||
return {getSubOperands(oper, targetArgs(), a)}; | getTargetOffsetAttr()); | ||||
} | } | ||||
llvm::Optional<llvm::ArrayRef<mlir::Value>> | llvm::Optional<llvm::ArrayRef<mlir::Value>> | ||||
fir::SelectCaseOp::getSuccessorOperands(llvm::ArrayRef<mlir::Value> operands, | fir::SelectCaseOp::getSuccessorOperands(llvm::ArrayRef<mlir::Value> operands, | ||||
unsigned oper) { | unsigned oper) { | ||||
auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr()); | auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr()); | ||||
auto segments = | auto segments = | ||||
getAttrOfType<mlir::DenseIntElementsAttr>(getOperandSegmentSizeAttr()); | getAttrOfType<mlir::DenseIntElementsAttr>(getOperandSegmentSizeAttr()); | ||||
return {getSubOperands(oper, getSubOperands(2, operands, segments), a)}; | return {getSubOperands(oper, getSubOperands(2, operands, segments), a)}; | ||||
} | } | ||||
bool fir::SelectCaseOp::canEraseSuccessorOperand() { return true; } | |||||
// parser for fir.select_case Op | // parser for fir.select_case Op | ||||
static mlir::ParseResult parseSelectCase(mlir::OpAsmParser &parser, | static mlir::ParseResult parseSelectCase(mlir::OpAsmParser &parser, | ||||
mlir::OperationState &result) { | mlir::OperationState &result) { | ||||
mlir::OpAsmParser::OperandType selector; | mlir::OpAsmParser::OperandType selector; | ||||
mlir::Type type; | mlir::Type type; | ||||
if (parseSelector(parser, result, selector, type)) | if (parseSelector(parser, result, selector, type)) | ||||
return mlir::failure(); | return mlir::failure(); | ||||
▲ Show 20 Lines • Show All 160 Lines • ▼ Show 20 Lines | fir::SelectRankOp::getCompareOperands(unsigned) { | ||||
return {}; | return {}; | ||||
} | } | ||||
llvm::Optional<llvm::ArrayRef<mlir::Value>> | llvm::Optional<llvm::ArrayRef<mlir::Value>> | ||||
fir::SelectRankOp::getCompareOperands(llvm::ArrayRef<mlir::Value>, unsigned) { | fir::SelectRankOp::getCompareOperands(llvm::ArrayRef<mlir::Value>, unsigned) { | ||||
return {}; | return {}; | ||||
} | } | ||||
llvm::Optional<mlir::OperandRange> | llvm::Optional<mlir::MutableOperandRange> | ||||
fir::SelectRankOp::getSuccessorOperands(unsigned oper) { | fir::SelectRankOp::getMutableSuccessorOperands(unsigned oper) { | ||||
auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr()); | return ::getMutableSuccessorOperands(oper, targetArgsMutable(), | ||||
return {getSubOperands(oper, targetArgs(), a)}; | getTargetOffsetAttr()); | ||||
} | } | ||||
llvm::Optional<llvm::ArrayRef<mlir::Value>> | llvm::Optional<llvm::ArrayRef<mlir::Value>> | ||||
fir::SelectRankOp::getSuccessorOperands(llvm::ArrayRef<mlir::Value> operands, | fir::SelectRankOp::getSuccessorOperands(llvm::ArrayRef<mlir::Value> operands, | ||||
unsigned oper) { | unsigned oper) { | ||||
auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr()); | auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr()); | ||||
auto segments = | auto segments = | ||||
getAttrOfType<mlir::DenseIntElementsAttr>(getOperandSegmentSizeAttr()); | getAttrOfType<mlir::DenseIntElementsAttr>(getOperandSegmentSizeAttr()); | ||||
return {getSubOperands(oper, getSubOperands(2, operands, segments), a)}; | return {getSubOperands(oper, getSubOperands(2, operands, segments), a)}; | ||||
} | } | ||||
bool fir::SelectRankOp::canEraseSuccessorOperand() { return true; } | |||||
unsigned fir::SelectRankOp::targetOffsetSize() { | unsigned fir::SelectRankOp::targetOffsetSize() { | ||||
return denseElementsSize( | return denseElementsSize( | ||||
getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr())); | getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr())); | ||||
} | } | ||||
//===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||
// SelectTypeOp | // SelectTypeOp | ||||
//===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||
llvm::Optional<mlir::OperandRange> | llvm::Optional<mlir::OperandRange> | ||||
fir::SelectTypeOp::getCompareOperands(unsigned) { | fir::SelectTypeOp::getCompareOperands(unsigned) { | ||||
return {}; | return {}; | ||||
} | } | ||||
llvm::Optional<llvm::ArrayRef<mlir::Value>> | llvm::Optional<llvm::ArrayRef<mlir::Value>> | ||||
fir::SelectTypeOp::getCompareOperands(llvm::ArrayRef<mlir::Value>, unsigned) { | fir::SelectTypeOp::getCompareOperands(llvm::ArrayRef<mlir::Value>, unsigned) { | ||||
return {}; | return {}; | ||||
} | } | ||||
llvm::Optional<mlir::OperandRange> | llvm::Optional<mlir::MutableOperandRange> | ||||
fir::SelectTypeOp::getSuccessorOperands(unsigned oper) { | fir::SelectTypeOp::getMutableSuccessorOperands(unsigned oper) { | ||||
auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr()); | return ::getMutableSuccessorOperands(oper, targetArgsMutable(), | ||||
return {getSubOperands(oper, targetArgs(), a)}; | getTargetOffsetAttr()); | ||||
} | } | ||||
llvm::Optional<llvm::ArrayRef<mlir::Value>> | llvm::Optional<llvm::ArrayRef<mlir::Value>> | ||||
fir::SelectTypeOp::getSuccessorOperands(llvm::ArrayRef<mlir::Value> operands, | fir::SelectTypeOp::getSuccessorOperands(llvm::ArrayRef<mlir::Value> operands, | ||||
unsigned oper) { | unsigned oper) { | ||||
auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr()); | auto a = getAttrOfType<mlir::DenseIntElementsAttr>(getTargetOffsetAttr()); | ||||
auto segments = | auto segments = | ||||
getAttrOfType<mlir::DenseIntElementsAttr>(getOperandSegmentSizeAttr()); | getAttrOfType<mlir::DenseIntElementsAttr>(getOperandSegmentSizeAttr()); | ||||
return {getSubOperands(oper, getSubOperands(2, operands, segments), a)}; | return {getSubOperands(oper, getSubOperands(2, operands, segments), a)}; | ||||
} | } | ||||
bool fir::SelectTypeOp::canEraseSuccessorOperand() { return true; } | |||||
static ParseResult parseSelectType(OpAsmParser &parser, | static ParseResult parseSelectType(OpAsmParser &parser, | ||||
OperationState &result) { | OperationState &result) { | ||||
mlir::OpAsmParser::OperandType selector; | mlir::OpAsmParser::OperandType selector; | ||||
mlir::Type type; | mlir::Type type; | ||||
if (parseSelector(parser, result, selector, type)) | if (parseSelector(parser, result, selector, type)) | ||||
return mlir::failure(); | return mlir::failure(); | ||||
llvm::SmallVector<mlir::Attribute, 8> attrs; | llvm::SmallVector<mlir::Attribute, 8> attrs; | ||||
▲ Show 20 Lines • Show All 246 Lines • Show Last 20 Lines |