#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
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
--- /dev/null
+// 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<i32>) {
+ %0 = hlfir.no_reassoc %arg0 : !fir.ref<i32>
+ return
+}
+// CHECK-LABEL: func.func @no_reassoc_var(
+// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i32>) {
+// CHECK: hlfir.no_reassoc %[[VAL_0]] : !fir.ref<i32>
+
+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>