diff options
Diffstat (limited to 'flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp')
| -rw-r--r-- | flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp | 84 |
1 files changed, 82 insertions, 2 deletions
diff --git a/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp b/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp index 3c5095da0145..1a63b1bea317 100644 --- a/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp +++ b/flang/lib/Optimizer/HLFIR/IR/HLFIROps.cpp @@ -265,7 +265,8 @@ void hlfir::DeclareOp::build(mlir::OpBuilder &builder, mlir::OperationState &result, mlir::Value memref, llvm::StringRef uniq_name, mlir::Value shape, mlir::ValueRange typeparams, - mlir::Value dummy_scope, + mlir::Value dummy_scope, mlir::Value storage, + std::uint64_t storage_offset, fir::FortranVariableFlagsAttr fortran_attrs, cuf::DataAttributeAttr data_attr) { auto nameAttr = builder.getStringAttr(uniq_name); @@ -279,7 +280,8 @@ void hlfir::DeclareOp::build(mlir::OpBuilder &builder, auto [hlfirVariableType, firVarType] = getDeclareOutputTypes(inputType, hasExplicitLbs); build(builder, result, {hlfirVariableType, firVarType}, memref, shape, - typeparams, dummy_scope, nameAttr, fortran_attrs, data_attr); + typeparams, dummy_scope, storage, storage_offset, nameAttr, + fortran_attrs, data_attr); } llvm::LogicalResult hlfir::DeclareOp::verify() { @@ -821,6 +823,84 @@ void hlfir::ConcatOp::getEffects( } //===----------------------------------------------------------------------===// +// CmpCharOp +//===----------------------------------------------------------------------===// + +llvm::LogicalResult hlfir::CmpCharOp::verify() { + mlir::Value lchr = getLchr(); + mlir::Value rchr = getRchr(); + + unsigned kind = getCharacterKind(lchr.getType()); + if (kind != getCharacterKind(rchr.getType())) + return emitOpError("character arguments must have the same KIND"); + + switch (getPredicate()) { + case mlir::arith::CmpIPredicate::slt: + case mlir::arith::CmpIPredicate::sle: + case mlir::arith::CmpIPredicate::eq: + case mlir::arith::CmpIPredicate::ne: + case mlir::arith::CmpIPredicate::sgt: + case mlir::arith::CmpIPredicate::sge: + break; + default: + return emitOpError("expected signed predicate"); + } + + return mlir::success(); +} + +void hlfir::CmpCharOp::getEffects( + llvm::SmallVectorImpl< + mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>> + &effects) { + getIntrinsicEffects(getOperation(), effects); +} + +//===----------------------------------------------------------------------===// +// CharTrimOp +//===----------------------------------------------------------------------===// + +void hlfir::CharTrimOp::build(mlir::OpBuilder &builder, + mlir::OperationState &result, mlir::Value chr) { + unsigned kind = getCharacterKind(chr.getType()); + auto resultType = hlfir::ExprType::get( + builder.getContext(), hlfir::ExprType::Shape{}, + fir::CharacterType::get(builder.getContext(), kind, + fir::CharacterType::unknownLen()), + /*polymorphic=*/false); + build(builder, result, resultType, chr); +} + +void hlfir::CharTrimOp::getEffects( + llvm::SmallVectorImpl< + mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>> + &effects) { + getIntrinsicEffects(getOperation(), effects); +} + +//===----------------------------------------------------------------------===// +// IndexOp +//===----------------------------------------------------------------------===// + +llvm::LogicalResult hlfir::IndexOp::verify() { + mlir::Value substr = getSubstr(); + mlir::Value str = getStr(); + + unsigned charKind = getCharacterKind(substr.getType()); + if (charKind != getCharacterKind(str.getType())) + return emitOpError("character arguments must have the same KIND"); + + return mlir::success(); +} + +void hlfir::IndexOp::getEffects( + llvm::SmallVectorImpl< + mlir::SideEffects::EffectInstance<mlir::MemoryEffects::Effect>> + &effects) { + getIntrinsicEffects(getOperation(), effects); +} + +//===----------------------------------------------------------------------===// // NumericalReductionOp //===----------------------------------------------------------------------===// |
