diff --git a/flang/include/flang/Optimizer/HLFIR/HLFIROps.h b/flang/include/flang/Optimizer/HLFIR/HLFIROps.h --- a/flang/include/flang/Optimizer/HLFIR/HLFIROps.h +++ b/flang/include/flang/Optimizer/HLFIR/HLFIROps.h @@ -13,6 +13,7 @@ #include "flang/Optimizer/Dialect/FIRType.h" #include "flang/Optimizer/Dialect/FortranVariableInterface.h" #include "flang/Optimizer/HLFIR/HLFIRDialect.h" +#include "mlir/Interfaces/InferTypeOpInterface.h" #include "mlir/Interfaces/SideEffectInterfaces.h" #define GET_OP_CLASSES diff --git a/flang/include/flang/Optimizer/HLFIR/HLFIROps.td b/flang/include/flang/Optimizer/HLFIR/HLFIROps.td --- a/flang/include/flang/Optimizer/HLFIR/HLFIROps.td +++ b/flang/include/flang/Optimizer/HLFIR/HLFIROps.td @@ -318,5 +318,18 @@ let builders = [OpBuilder<(ins "mlir::Value":$var)>]; } +def hlfir_NoReassocOp : hlfir_Op<"no_reassoc", [NoMemoryEffect, SameOperandsAndResultType]> { + let summary = "synthetic op to prevent reassociation"; + + let description = [{ + Same as fir.reassoc, except it accepts hlfir.expr arguments. + }]; + + let arguments = (ins AnyFortranEntity:$val); + let results = (outs AnyFortranEntity); + + let assemblyFormat = "$val attr-dict `:` type($val)"; +} + #endif // FORTRAN_DIALECT_HLFIR_OPS diff --git a/flang/test/HLFIR/no_reassoc.fir b/flang/test/HLFIR/no_reassoc.fir new file mode 100644 --- /dev/null +++ b/flang/test/HLFIR/no_reassoc.fir @@ -0,0 +1,27 @@ +// Test hlfir.no_reassoc operation parse, verify (no errors), and unparse. + +// RUN: fir-opt %s | fir-opt | FileCheck %s + +func.func @no_reassoc_value(%arg0: i32) { + %0 = hlfir.no_reassoc %arg0 : i32 + return +} +// CHECK-LABEL: func.func @no_reassoc_value( +// CHECK-SAME: %[[VAL_0:.*]]: i32) { +// CHECK: hlfir.no_reassoc %[[VAL_0]] : i32 + +func.func @no_reassoc_var(%arg0: !fir.ref) { + %0 = hlfir.no_reassoc %arg0 : !fir.ref + return +} +// CHECK-LABEL: func.func @no_reassoc_var( +// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref) { +// CHECK: hlfir.no_reassoc %[[VAL_0]] : !fir.ref + +func.func @no_reassoc_expr(%arg0: !hlfir.expr<10xi32>) { + %0 = hlfir.no_reassoc %arg0 : !hlfir.expr<10xi32> + return +} +// CHECK-LABEL: func.func @no_reassoc_expr( +// CHECK-SAME: %[[VAL_0:.*]]: !hlfir.expr<10xi32>) { +// CHECK: hlfir.no_reassoc %[[VAL_0]] : !hlfir.expr<10xi32>