Skip to content

Commit 44c0bdb

Browse files
authored
[flang][HLFIR] Use GreedyPatternRewriter in LowerHLFIRIntrinsics (#83438)
In #83253 @matthias-springer pointed out that LowerHLFIRIntrinsics.cpp should not be using rewrite patterns with the dialect conversion driver. The intention of this pass is to lower HLFIR intrinsic operations into FIR so it conceptually fits dialect conversion. However, dialect conversion is much stricter about changing types when replacing operations. This pass sometimes looses track of array bounds, resulting in replacements with operations with different but compatible types (expressions of the same rank and element types but with or without compile time known array bounds). This is difficult to accommodate with the dialect conversion driver and so I have changed to use the greedy pattern rewriter. There is a lot of test churn because the greedy pattern rewriter also performs canonicalization.
1 parent 4c8c335 commit 44c0bdb

17 files changed

+190
-222
lines changed

flang/lib/Optimizer/HLFIR/Transforms/LowerHLFIRIntrinsics.cpp

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
#include "flang/Optimizer/HLFIR/HLFIROps.h"
1919
#include "flang/Optimizer/HLFIR/Passes.h"
2020
#include "mlir/IR/BuiltinDialect.h"
21+
#include "mlir/IR/MLIRContext.h"
2122
#include "mlir/IR/PatternMatch.h"
2223
#include "mlir/Pass/Pass.h"
2324
#include "mlir/Pass/PassManager.h"
2425
#include "mlir/Support/LogicalResult.h"
25-
#include "mlir/Transforms/DialectConversion.h"
26-
#include <mlir/IR/MLIRContext.h>
26+
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
2727
#include <optional>
2828

2929
namespace hlfir {
@@ -176,14 +176,7 @@ class HlfirIntrinsicConversion : public mlir::OpRewritePattern<OP> {
176176
rewriter.eraseOp(use);
177177
}
178178
}
179-
// TODO: This entire pass should be a greedy pattern rewrite or a manual
180-
// IR traversal. A dialect conversion cannot be used here because
181-
// `replaceAllUsesWith` is not supported. Similarly, `replaceOp` is not
182-
// suitable because "op->getResult(0)" and "base" can have different types.
183-
// In such a case, the dialect conversion will attempt to convert the type,
184-
// but no type converter is specified in this pass. Also note that all
185-
// patterns in this pass are actually rewrite patterns.
186-
op->getResult(0).replaceAllUsesWith(base);
179+
187180
rewriter.replaceOp(op, base);
188181
}
189182
};
@@ -491,19 +484,19 @@ class LowerHLFIRIntrinsics
491484
ProductOpConversion, TransposeOpConversion, CountOpConversion,
492485
DotProductOpConversion, MaxvalOpConversion, MinvalOpConversion,
493486
MinlocOpConversion, MaxlocOpConversion>(context);
494-
mlir::ConversionTarget target(*context);
495-
target.addLegalDialect<mlir::BuiltinDialect, mlir::arith::ArithDialect,
496-
mlir::func::FuncDialect, fir::FIROpsDialect,
497-
hlfir::hlfirDialect>();
498-
target.addIllegalOp<hlfir::MatmulOp, hlfir::MatmulTransposeOp, hlfir::SumOp,
499-
hlfir::ProductOp, hlfir::TransposeOp, hlfir::AnyOp,
500-
hlfir::AllOp, hlfir::DotProductOp, hlfir::CountOp,
501-
hlfir::MaxvalOp, hlfir::MinvalOp, hlfir::MinlocOp,
502-
hlfir::MaxlocOp>();
503-
target.markUnknownOpDynamicallyLegal(
504-
[](mlir::Operation *) { return true; });
505-
if (mlir::failed(
506-
mlir::applyFullConversion(module, target, std::move(patterns)))) {
487+
488+
// While conceptually this pass is performing dialect conversion, we use
489+
// pattern rewrites here instead of dialect conversion because this pass
490+
// looses array bounds from some of the expressions e.g.
491+
// !hlfir.expr<2xi32> -> !hlfir.expr<?xi32>
492+
// MLIR thinks this is a different type so dialect conversion fails.
493+
// Pattern rewriting only requires that the resulting IR is still valid
494+
mlir::GreedyRewriteConfig config;
495+
// Prevent the pattern driver from merging blocks
496+
config.enableRegionSimplification = false;
497+
498+
if (mlir::failed(mlir::applyPatternsAndFoldGreedily(
499+
module, std::move(patterns), config))) {
507500
mlir::emitError(mlir::UnknownLoc::get(context),
508501
"failure in HLFIR intrinsic lowering");
509502
signalPassFailure();

flang/test/HLFIR/all-lowering.fir

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ func.func @_QPall2(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_n
3434
// CHECK: %[[ARG0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<4>>>
3535
// CHECK: %[[ARG1:.*]]: !fir.box<!fir.array<?x!fir.logical<4>>>
3636
// CHECK: %[[ARG2:.*]]: !fir.ref<i32>
37+
// CHECK-DAG: %[[TRUE:.*]] = arith.constant true
3738
// CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG0]]
3839
// CHECK-DAG: %[[DIM_VAR:.*]]:2 = hlfir.declare %[[ARG2]]
3940
// CHECK-DAG: %[[RES:.*]]:2 = hlfir.declare %[[ARG1]]
@@ -55,7 +56,6 @@ func.func @_QPall2(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_n
5556
// CHECK-NEXT: %[[ADDR:.*]] = fir.box_addr %[[RET]]
5657
// CHECK-NEXT: %[[SHIFT:.*]] = fir.shape_shift %[[BOX_DIMS]]#0, %[[BOX_DIMS]]#1
5758
// CHECK-NEXT: %[[TMP:.*]]:2 = hlfir.declare %[[ADDR]](%[[SHIFT]]) {uniq_name = ".tmp.intrinsic_result"}
58-
// CHECK: %[[TRUE:.*]] = arith.constant true
5959
// CHECK: %[[EXPR:.*]] = hlfir.as_expr %[[TMP]]#0 move %[[TRUE]] : (!fir.box<!fir.array<?x!fir.logical<4>>>, i1) -> !hlfir.expr<?x!fir.logical<4>>
6060
// CHECK: hlfir.assign %[[EXPR]] to %[[RES]]#0
6161
// CHECK: hlfir.destroy %[[EXPR]]
@@ -79,6 +79,7 @@ func.func @_QPall3(%arg0: !fir.ref<!fir.array<2x!fir.logical<4>>> {fir.bindc_nam
7979
}
8080
// CHECK-LABEL: func.func @_QPall3(
8181
// CHECK: %[[ARG0:.*]]: !fir.ref<!fir.array<2x!fir.logical<4>>>
82+
// CHECK-DAG: %[[TRUE:.*]] = arith.constant true
8283
// CHECK-DAG: %[[RET_BOX:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.logical<4>>>>
8384
// CHECK-DAG: %[[RET_ADDR:.*]] = fir.zero_bits !fir.heap<!fir.array<?x!fir.logical<4>>>
8485
// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : index
@@ -101,7 +102,6 @@ func.func @_QPall3(%arg0: !fir.ref<!fir.array<2x!fir.logical<4>>> {fir.bindc_nam
101102
// CHECK-NEXT: %[[ADDR:.*]] = fir.box_addr %[[RET]]
102103
// CHECK-NEXT: %[[SHIFT:.*]] = fir.shape_shift %[[BOX_DIMS]]#0, %[[BOX_DIMS]]#1
103104
// CHECK-NEXT: %[[TMP:.*]]:2 = hlfir.declare %[[ADDR]](%[[SHIFT]]) {uniq_name = ".tmp.intrinsic_result"}
104-
// CHECK: %[[TRUE:.*]] = arith.constant true
105105
// CHECK: %[[EXPR:.*]] = hlfir.as_expr %[[TMP]]#0 move %[[TRUE]] : (!fir.box<!fir.array<?x!fir.logical<4>>>, i1) -> !hlfir.expr<?x!fir.logical<4>>
106106
// CHECK: hlfir.assign %[[EXPR]] to %[[RES]]
107107
// CHECK: hlfir.destroy %[[EXPR]]
@@ -125,6 +125,7 @@ func.func @_QPall4(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_n
125125
// CHECK: %[[ARG0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<4>>>
126126
// CHECK: %[[ARG1:.*]]: !fir.box<!fir.array<?x!fir.logical<4>>>
127127
// CHECK: %[[ARG2:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>>
128+
// CHECK-DAG: %[[TRUE:.*]] = arith.constant true
128129
// CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG0]]
129130
// CHECK-DAG: %[[DIM_ARG:.*]]:2 = hlfir.declare %[[ARG2]]
130131
// CHECK-DAG: %[[RES:.*]]:2 = hlfir.declare %[[ARG1]]
@@ -149,9 +150,8 @@ func.func @_QPall4(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_n
149150
// CHECK-NEXT: %[[ADDR:.*]] = fir.box_addr %[[RET]]
150151
// CHECK-NEXT: %[[SHIFT:.*]] = fir.shape_shift %[[BOX_DIMS]]#0, %[[BOX_DIMS]]#1
151152
// CHECK-NEXT: %[[TMP:.*]]:2 = hlfir.declare %[[ADDR]](%[[SHIFT]]) {uniq_name = ".tmp.intrinsic_result"}
152-
// CHECK: %[[TRUE:.*]] = arith.constant true
153153
// CHECK: %[[EXPR:.*]] = hlfir.as_expr %[[TMP]]#0 move %[[TRUE]] : (!fir.box<!fir.array<?x!fir.logical<4>>>, i1) -> !hlfir.expr<?x!fir.logical<4>>
154154
// CHECK: hlfir.assign %[[EXPR]] to %[[RES]]
155155
// CHECK: hlfir.destroy %[[EXPR]]
156156
// CHECK-NEXT: return
157-
// CHECK-NEXT: }
157+
// CHECK-NEXT: }

flang/test/HLFIR/any-lowering.fir

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func.func @_QPany2(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_n
3636
// CHECK: %[[ARG0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<4>>>
3737
// CHECK: %[[ARG1:.*]]: !fir.box<!fir.array<?x!fir.logical<4>>>
3838
// CHECK: %[[ARG2:.*]]: !fir.ref<i32>
39+
// CHECK-DAG: %[[TRUE:.*]] = arith.constant true
3940
// CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG0]]
4041
// CHECK-DAG: %[[DIM_VAR:.*]]:2 = hlfir.declare %[[ARG2]]
4142
// CHECK-DAG: %[[RES:.*]]:2 = hlfir.declare %[[ARG1]]
@@ -57,7 +58,6 @@ func.func @_QPany2(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_n
5758
// CHECK-NEXT: %[[ADDR:.*]] = fir.box_addr %[[RET]]
5859
// CHECK-NEXT: %[[SHIFT:.*]] = fir.shape_shift %[[BOX_DIMS]]#0, %[[BOX_DIMS]]#1
5960
// CHECK-NEXT: %[[TMP:.*]]:2 = hlfir.declare %[[ADDR]](%[[SHIFT]]) {uniq_name = ".tmp.intrinsic_result"}
60-
// CHECK: %[[TRUE:.*]] = arith.constant true
6161
// CHECK: %[[EXPR:.*]] = hlfir.as_expr %[[TMP]]#0 move %[[TRUE]] : (!fir.box<!fir.array<?x!fir.logical<4>>>, i1) -> !hlfir.expr<?x!fir.logical<4>>
6262
// CHECK: hlfir.assign %[[EXPR]] to %[[RES]]#0
6363
// CHECK: hlfir.destroy %[[EXPR]]
@@ -82,6 +82,7 @@ func.func @_QPany3(%arg0: !fir.ref<!fir.array<2x!fir.logical<4>>> {fir.bindc_nam
8282
}
8383
// CHECK-LABEL: func.func @_QPany3(
8484
// CHECK: %[[ARG0:.*]]: !fir.ref<!fir.array<2x!fir.logical<4>>>
85+
// CHECK-DAG: %[[TRUE:.*]] = arith.constant true
8586
// CHECK-DAG: %[[RET_BOX:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.logical<4>>>>
8687
// CHECK-DAG: %[[RET_ADDR:.*]] = fir.zero_bits !fir.heap<!fir.array<?x!fir.logical<4>>>
8788
// CHECK-DAG: %[[C0:.*]] = arith.constant 0 : index
@@ -104,7 +105,6 @@ func.func @_QPany3(%arg0: !fir.ref<!fir.array<2x!fir.logical<4>>> {fir.bindc_nam
104105
// CHECK-NEXT: %[[ADDR:.*]] = fir.box_addr %[[RET]]
105106
// CHECK-NEXT: %[[SHIFT:.*]] = fir.shape_shift %[[BOX_DIMS]]#0, %[[BOX_DIMS]]#1
106107
// CHECK-NEXT: %[[TMP:.*]]:2 = hlfir.declare %[[ADDR]](%[[SHIFT]]) {uniq_name = ".tmp.intrinsic_result"}
107-
// CHECK: %[[TRUE:.*]] = arith.constant true
108108
// CHECK: %[[EXPR:.*]] = hlfir.as_expr %[[TMP]]#0 move %[[TRUE]] : (!fir.box<!fir.array<?x!fir.logical<4>>>, i1) -> !hlfir.expr<?x!fir.logical<4>>
109109
// CHECK: hlfir.assign %[[EXPR]] to %[[RES]]
110110
// CHECK: hlfir.destroy %[[EXPR]]
@@ -129,6 +129,7 @@ func.func @_QPany4(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_n
129129
// CHECK: %[[ARG0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<4>>>
130130
// CHECK: %[[ARG1:.*]]: !fir.box<!fir.array<?x!fir.logical<4>>>
131131
// CHECK: %[[ARG2:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>>
132+
// CHECK-DAG: %[[TRUE:.*]] = arith.constant true
132133
// CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG0]]
133134
// CHECK-DAG: %[[DIM_ARG:.*]]:2 = hlfir.declare %[[ARG2]]
134135
// CHECK-DAG: %[[RES:.*]]:2 = hlfir.declare %[[ARG1]]
@@ -153,7 +154,6 @@ func.func @_QPany4(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_n
153154
// CHECK-NEXT: %[[ADDR:.*]] = fir.box_addr %[[RET]]
154155
// CHECK-NEXT: %[[SHIFT:.*]] = fir.shape_shift %[[BOX_DIMS]]#0, %[[BOX_DIMS]]#1
155156
// CHECK-NEXT: %[[TMP:.*]]:2 = hlfir.declare %[[ADDR]](%[[SHIFT]]) {uniq_name = ".tmp.intrinsic_result"}
156-
// CHECK: %[[TRUE:.*]] = arith.constant true
157157
// CHECK: %[[EXPR:.*]] = hlfir.as_expr %[[TMP]]#0 move %[[TRUE]] : (!fir.box<!fir.array<?x!fir.logical<4>>>, i1) -> !hlfir.expr<?x!fir.logical<4>>
158158
// CHECK: hlfir.assign %[[EXPR]] to %[[RES]]
159159
// CHECK: hlfir.destroy %[[EXPR]]

flang/test/HLFIR/count-lowering-default-int-kinds.fir

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,39 @@
22
// RUN: fir-opt %s -lower-hlfir-intrinsics | FileCheck %s
33

44
module attributes {fir.defaultkind = "a1c4d8i8l4r4", fir.kindmap = ""} {
5-
func.func @test_i8(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: i64) {
5+
func.func @test_i8(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: i64) -> !hlfir.expr<?xi64> {
66
%4 = hlfir.count %arg0 dim %arg1 : (!fir.box<!fir.array<?x?x!fir.logical<4>>>, i64) -> !hlfir.expr<?xi64>
7-
return
7+
return %4 : !hlfir.expr<?xi64>
88
}
99
}
1010
// CHECK-LABEL: func.func @test_i8
1111
// CHECK: %[[KIND:.*]] = arith.constant 8 : i32
1212
// CHECK: fir.call @_FortranACountDim(%{{.*}}, %{{.*}}, %{{.*}}, %[[KIND]], %{{.*}}, %{{.*}}) : (!fir.ref<!fir.box<none>>, !fir.box<none>, i32, i32, !fir.ref<i8>, i32) -> none
1313

1414
module attributes {fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = ""} {
15-
func.func @test_i4(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: i64) {
15+
func.func @test_i4(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: i64) -> !hlfir.expr<?xi32> {
1616
%4 = hlfir.count %arg0 dim %arg1 : (!fir.box<!fir.array<?x?x!fir.logical<4>>>, i64) -> !hlfir.expr<?xi32>
17-
return
17+
return %4 : !hlfir.expr<?xi32>
1818
}
1919
}
2020
// CHECK-LABEL: func.func @test_i4
2121
// CHECK: %[[KIND:.*]] = arith.constant 4 : i32
2222
// CHECK: fir.call @_FortranACountDim(%{{.*}}, %{{.*}}, %{{.*}}, %[[KIND]], %{{.*}}, %{{.*}}) : (!fir.ref<!fir.box<none>>, !fir.box<none>, i32, i32, !fir.ref<i8>, i32) -> none
2323

2424
module attributes {fir.defaultkind = "a1c4d8i2l4r4", fir.kindmap = ""} {
25-
func.func @test_i2(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: i64) {
25+
func.func @test_i2(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: i64) -> !hlfir.expr<?xi16> {
2626
%4 = hlfir.count %arg0 dim %arg1 : (!fir.box<!fir.array<?x?x!fir.logical<4>>>, i64) -> !hlfir.expr<?xi16>
27-
return
27+
return %4 : !hlfir.expr<?xi16>
2828
}
2929
}
3030
// CHECK-LABEL: func.func @test_i2
3131
// CHECK: %[[KIND:.*]] = arith.constant 2 : i32
3232
// CHECK: fir.call @_FortranACountDim(%{{.*}}, %{{.*}}, %{{.*}}, %[[KIND]], %{{.*}}, %{{.*}}) : (!fir.ref<!fir.box<none>>, !fir.box<none>, i32, i32, !fir.ref<i8>, i32) -> none
3333

3434
module attributes {fir.defaultkind = "a1c4d8i1l4r4", fir.kindmap = ""} {
35-
func.func @test_i1(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: i64) {
35+
func.func @test_i1(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc_name = "x"}, %arg1: i64) -> !hlfir.expr<?xi8> {
3636
%4 = hlfir.count %arg0 dim %arg1 : (!fir.box<!fir.array<?x?x!fir.logical<4>>>, i64) -> !hlfir.expr<?xi8>
37-
return
37+
return %4 : !hlfir.expr<?xi8>
3838
}
3939
}
4040
// CHECK-LABEL: func.func @test_i1

flang/test/HLFIR/count-lowering.fir

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ func.func @_QPcount2(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc
3434
// CHECK: %[[ARG0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<4>>>
3535
// CHECK: %[[ARG1:.*]]: !fir.box<!fir.array<?xi32>
3636
// CHECK: %[[ARG2:.*]]: !fir.ref<i32>
37+
// CHECK-DAG: %[[TRUE:.*]] = arith.constant true
3738
// CHECK-DAG: %[[KIND:.*]] = arith.constant 4 : i32
3839
// CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG0]]
3940
// CHECK-DAG: %[[DIM_VAR:.*]]:2 = hlfir.declare %[[ARG2]]
@@ -56,7 +57,6 @@ func.func @_QPcount2(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc
5657
// CHECK-NEXT: %[[ADDR:.*]] = fir.box_addr %[[RET]]
5758
// CHECK-NEXT: %[[SHIFT:.*]] = fir.shape_shift %[[BOX_DIMS]]#0, %[[BOX_DIMS]]#1
5859
// CHECK-NEXT: %[[TMP:.*]]:2 = hlfir.declare %[[ADDR]](%[[SHIFT]]) {uniq_name = ".tmp.intrinsic_result"}
59-
// CHECK: %[[TRUE:.*]] = arith.constant true
6060
// CHECK: %[[EXPR:.*]] = hlfir.as_expr %[[TMP]]#0 move %[[TRUE]] : (!fir.box<!fir.array<?xi32>>, i1) -> !hlfir.expr<?xi32>
6161
// CHECK: hlfir.assign %[[EXPR]] to %[[RES]]#0
6262
// CHECK: hlfir.destroy %[[EXPR]]
@@ -80,6 +80,7 @@ func.func @_QPcount3(%arg0: !fir.ref<!fir.array<2xi32>> {fir.bindc_name = "s"})
8080
}
8181
// CHECK-LABEL: func.func @_QPcount3(
8282
// CHECK: %[[ARG0:.*]]: !fir.ref<!fir.array<2xi32>>
83+
// CHECK-DAG: %[[TRUE:.*]] = arith.constant true
8384
// CHECK-DAG: %[[RET_BOX:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xi32>>>
8485
// CHECK-DAG: %[[KIND:.*]] = arith.constant 4 : i32
8586
// CHECK-DAG: %[[RET_ADDR:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>
@@ -104,7 +105,6 @@ func.func @_QPcount3(%arg0: !fir.ref<!fir.array<2xi32>> {fir.bindc_name = "s"})
104105
// CHECK-NEXT: %[[ADDR:.*]] = fir.box_addr %[[RET]]
105106
// CHECK-NEXT: %[[SHIFT:.*]] = fir.shape_shift %[[BOX_DIMS]]#0, %[[BOX_DIMS]]#1
106107
// CHECK-NEXT: %[[TMP:.*]]:2 = hlfir.declare %[[ADDR]](%[[SHIFT]]) {uniq_name = ".tmp.intrinsic_result"}
107-
// CHECK: %[[TRUE:.*]] = arith.constant true
108108
// CHECK: %[[EXPR:.*]] = hlfir.as_expr %[[TMP]]#0 move %[[TRUE]] : (!fir.box<!fir.array<?xi32>>, i1) -> !hlfir.expr<?xi32>
109109
// CHECK: hlfir.assign %[[EXPR]] to %[[RES]]
110110
// CHECK: hlfir.destroy %[[EXPR]]
@@ -133,6 +133,7 @@ func.func @_QPcount4(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc
133133
// CHECK: %[[ARG0:.*]]: !fir.box<!fir.array<?x?x!fir.logical<4>>>
134134
// CHECK: %[[ARG1:.*]]: !fir.box<!fir.array<?xi32>
135135
// CHECK: %[[ARG2:.*]]: !fir.ref<i32>
136+
// CHECK-DAG: %[[TRUE:.*]] = arith.constant true
136137
// CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[ARG0]]
137138
// CHECK-DAG: %[[DIM_VAR:.*]]:2 = hlfir.declare %[[ARG2]]
138139
// CHECK-DAG: %[[RES:.*]]:2 = hlfir.declare %[[ARG1]]
@@ -155,7 +156,6 @@ func.func @_QPcount4(%arg0: !fir.box<!fir.array<?x?x!fir.logical<4>>> {fir.bindc
155156
// CHECK-NEXT: %[[ADDR:.*]] = fir.box_addr %[[RET]]
156157
// CHECK-NEXT: %[[SHIFT:.*]] = fir.shape_shift %[[BOX_DIMS]]#0, %[[BOX_DIMS]]#1
157158
// CHECK-NEXT: %[[TMP:.*]]:2 = hlfir.declare %[[ADDR]](%[[SHIFT]]) {uniq_name = ".tmp.intrinsic_result"}
158-
// CHECK: %[[TRUE:.*]] = arith.constant true
159159
// CHECK: %[[EXPR:.*]] = hlfir.as_expr %[[TMP]]#0 move %[[TRUE]] : (!fir.box<!fir.array<?xi64>>, i1) -> !hlfir.expr<?xi64>
160160
// CHECK-NEXT: %[[OUT_SHAPE:.*]] = hlfir.shape_of %[[EXPR]]
161161
// CHECK-NEXT: %[[OUT:.*]] = hlfir.elemental %[[OUT_SHAPE]] : (!fir.shape<1>) -> !hlfir.expr<?xi32>

flang/test/HLFIR/dot_product-lowering.fir

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ func.func @_QPdot_product4(%arg0: !fir.box<!fir.array<?x!fir.logical<4>>> {fir.b
9696
// CHECK: %[[VAL_2:.*]] = fir.alloca !fir.logical<4>
9797
// CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]] {uniq_name = "_QFdot_product2Elhs"} : (!fir.box<!fir.array<?x!fir.logical<4>>>) -> (!fir.box<!fir.array<?x!fir.logical<4>>>, !fir.box<!fir.array<?x!fir.logical<4>>>)
9898
// CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "_QFdot_product2Erhs"} : (!fir.box<!fir.array<?x!fir.logical<4>>>) -> (!fir.box<!fir.array<?x!fir.logical<4>>>, !fir.box<!fir.array<?x!fir.logical<4>>>)
99-
// CHECK: %[[VAL_5:.*]] = fir.absent !fir.box<!fir.logical<4>>
10099
// CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_3]]#1 : (!fir.box<!fir.array<?x!fir.logical<4>>>) -> !fir.box<none>
101100
// CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_4]]#1 : (!fir.box<!fir.array<?x!fir.logical<4>>>) -> !fir.box<none>
102101
// CHECK: %[[VAL_12:.*]] = fir.call @_FortranADotProductLogical(%[[VAL_9]], %[[VAL_10]], %{{.*}}, %{{.*}}) fastmath<contract> : (!fir.box<none>, !fir.box<none>, !fir.ref<i8>, i32) -> i1

flang/test/HLFIR/extents-of-shape-of.f90

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,17 @@ elemental subroutine elem_sub(x)
3131
! CHECK-HLFIR-NEXT: hlfir.destroy %[[MUL]]
3232

3333
! ...
34+
! CHECK-FIR-DAG: %[[C0:.*]] = arith.constant 0 : index
35+
! CHECK-FIR-DAG: %[[C1:.*]] = arith.constant 1 : index
36+
! CHECK-FIR-DAG: %[[C2:.*]] = arith.constant 2 : index
3437
! CHECK-FIR: fir.call @_FortranAMatmul
3538
! CHECK-FIR-NEXT: %[[MUL:.*]] = fir.load %[[MUL_BOX:.*]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>
36-
! CHECK-FIR-NEXT: %[[C0:.*]] = arith.constant 0 : index
3739
! CHECK-FIR-NEXT: %[[DIMS0:.*]]:3 = fir.box_dims %[[MUL]], %[[C0]]
38-
! CHECK-FIR-NEXT: %[[C1:.*]] = arith.constant 1 : index
3940
! CHECK-FIR-NEXT: %[[DIMS1:.*]]:3 = fir.box_dims %[[MUL]], %[[C1]]
4041
! ...
4142
! CHECK-FIR: %[[SHAPE:.*]] = fir.shape %[[DIMS0]]#1, %[[DIMS1]]#1
42-
! CHECK-FIR-NEXT: %[[C2:.*]] = arith.constant 2 : index
43-
! CHECK-FIR-NEXT: %[[C1_1:.*]] = arith.constant 1 : index
44-
! CHECK-FIR-NEXT: fir.do_loop %[[ARG2:.*]] = %[[C1_1]] to %[[DIMS1]]#1 step %[[C1_1]] unordered {
45-
! CHECK-FIR-NEXT: fir.do_loop %[[ARG3:.*]] = %[[C1_1]] to %[[C2]] step %[[C1_1]] unordered {
43+
! CHECK-FIR-NEXT: fir.do_loop %[[ARG2:.*]] = %[[C1]] to %[[DIMS1]]#1 step %[[C1]] unordered {
44+
! CHECK-FIR-NEXT: fir.do_loop %[[ARG3:.*]] = %[[C1]] to %[[C2]] step %[[C1]] unordered {
4645
! ...
4746

4847
! CHECK-ALL: return

0 commit comments

Comments
 (0)