Skip to content

Commit 44cd8f0

Browse files
authored
[flang] Lower CSHIFT to hlfir.cshift operation. (#118917)
1 parent 429f0f1 commit 44cd8f0

File tree

3 files changed

+258
-8
lines changed

3 files changed

+258
-8
lines changed

flang/lib/Lower/HlfirIntrinsics.cpp

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,17 @@ class HlfirCharExtremumLowering : public HlfirTransformationalIntrinsic {
159159
hlfir::CharExtremumPredicate pred;
160160
};
161161

162+
class HlfirCShiftLowering : public HlfirTransformationalIntrinsic {
163+
public:
164+
using HlfirTransformationalIntrinsic::HlfirTransformationalIntrinsic;
165+
166+
protected:
167+
mlir::Value
168+
lowerImpl(const Fortran::lower::PreparedActualArguments &loweredActuals,
169+
const fir::IntrinsicArgumentLoweringRules *argLowering,
170+
mlir::Type stmtResultType) override;
171+
};
172+
162173
} // namespace
163174

164175
mlir::Value HlfirTransformationalIntrinsic::loadBoxAddress(
@@ -270,11 +281,12 @@ HlfirTransformationalIntrinsic::computeResultType(mlir::Value argArray,
270281
hlfir::ExprType::Shape{array.getShape()};
271282
mlir::Type elementType = array.getEleTy();
272283
return hlfir::ExprType::get(builder.getContext(), resultShape, elementType,
273-
/*polymorphic=*/false);
284+
fir::isPolymorphicType(stmtResultType));
274285
} else if (auto resCharType =
275286
mlir::dyn_cast<fir::CharacterType>(stmtResultType)) {
276287
normalisedResult = hlfir::ExprType::get(
277-
builder.getContext(), hlfir::ExprType::Shape{}, resCharType, false);
288+
builder.getContext(), hlfir::ExprType::Shape{}, resCharType,
289+
/*polymorphic=*/false);
278290
}
279291
return normalisedResult;
280292
}
@@ -387,6 +399,26 @@ mlir::Value HlfirCharExtremumLowering::lowerImpl(
387399
return createOp<hlfir::CharExtremumOp>(pred, mlir::ValueRange{operands});
388400
}
389401

402+
mlir::Value HlfirCShiftLowering::lowerImpl(
403+
const Fortran::lower::PreparedActualArguments &loweredActuals,
404+
const fir::IntrinsicArgumentLoweringRules *argLowering,
405+
mlir::Type stmtResultType) {
406+
auto operands = getOperandVector(loweredActuals, argLowering);
407+
assert(operands.size() == 3);
408+
mlir::Value dim = operands[2];
409+
if (!dim) {
410+
// If DIM is not present, drop the last element which is a null Value.
411+
operands.truncate(2);
412+
} else {
413+
// If DIM is present, then dereference it if it is a ref.
414+
dim = hlfir::loadTrivialScalar(loc, builder, hlfir::Entity{dim});
415+
operands[2] = dim;
416+
}
417+
418+
mlir::Type resultType = computeResultType(operands[0], stmtResultType);
419+
return createOp<hlfir::CShiftOp>(resultType, operands);
420+
}
421+
390422
std::optional<hlfir::EntityWithAttributes> Fortran::lower::lowerHlfirIntrinsic(
391423
fir::FirOpBuilder &builder, mlir::Location loc, const std::string &name,
392424
const Fortran::lower::PreparedActualArguments &loweredActuals,
@@ -432,6 +464,9 @@ std::optional<hlfir::EntityWithAttributes> Fortran::lower::lowerHlfirIntrinsic(
432464
if (name == "maxloc")
433465
return HlfirMaxlocLowering{builder, loc}.lower(loweredActuals, argLowering,
434466
stmtResultType);
467+
if (name == "cshift")
468+
return HlfirCShiftLowering{builder, loc}.lower(loweredActuals, argLowering,
469+
stmtResultType);
435470
if (mlir::isa<fir::CharacterType>(stmtResultType)) {
436471
if (name == "min")
437472
return HlfirCharExtremumLowering{builder, loc,

flang/test/Lower/HLFIR/cshift.f90

Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
! Test lowering of CSHIFT intrinsic to HLFIR
2+
! RUN: bbc -emit-hlfir -o - -I nowhere %s 2>&1 | FileCheck %s
3+
4+
module types
5+
type t
6+
end type t
7+
end module types
8+
9+
! 1d shift by scalar
10+
subroutine cshift1(a, s)
11+
integer :: a(:), s
12+
a = CSHIFT(a, 2)
13+
end subroutine
14+
! CHECK-LABEL: func.func @_QPcshift1(
15+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},
16+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}) {
17+
! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope
18+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]
19+
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]
20+
! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i32
21+
! CHECK: %[[VAL_6:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_5]] : (!fir.box<!fir.array<?xi32>>, i32) -> !hlfir.expr<?xi32>
22+
! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_3]]#0 : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>>
23+
! CHECK: hlfir.destroy %[[VAL_6]] : !hlfir.expr<?xi32>
24+
! CHECK: return
25+
! CHECK: }
26+
27+
! 1d shift by scalar with dim
28+
subroutine cshift2(a, s)
29+
integer :: a(:), s
30+
a = CSHIFT(a, 2, 1)
31+
end subroutine
32+
! CHECK-LABEL: func.func @_QPcshift2(
33+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},
34+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}) {
35+
! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope
36+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]
37+
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]
38+
! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i32
39+
! CHECK: %[[VAL_6:.*]] = arith.constant 1 : i32
40+
! CHECK: %[[VAL_7:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_5]] dim %[[VAL_6]] : (!fir.box<!fir.array<?xi32>>, i32, i32) -> !hlfir.expr<?xi32>
41+
! CHECK: hlfir.assign %[[VAL_7]] to %[[VAL_3]]#0 : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>>
42+
! CHECK: hlfir.destroy %[[VAL_7]] : !hlfir.expr<?xi32>
43+
! CHECK: return
44+
! CHECK: }
45+
46+
! 2d shift by scalar
47+
subroutine cshift3(a, s)
48+
integer :: a(:,:), s
49+
a = CSHIFT(a, 2)
50+
end subroutine
51+
! CHECK-LABEL: func.func @_QPcshift3(
52+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "a"},
53+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}) {
54+
! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope
55+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]
56+
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]
57+
! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i32
58+
! CHECK: %[[VAL_6:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_5]] : (!fir.box<!fir.array<?x?xi32>>, i32) -> !hlfir.expr<?x?xi32>
59+
! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_3]]#0 : !hlfir.expr<?x?xi32>, !fir.box<!fir.array<?x?xi32>>
60+
! CHECK: hlfir.destroy %[[VAL_6]] : !hlfir.expr<?x?xi32>
61+
! CHECK: return
62+
! CHECK: }
63+
64+
! 2d shift by scalar with dim
65+
subroutine cshift4(a, s)
66+
integer :: a(:,:), s
67+
a = CSHIFT(a, 2, 2)
68+
end subroutine
69+
! CHECK-LABEL: func.func @_QPcshift4(
70+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "a"},
71+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}) {
72+
! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope
73+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]
74+
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]
75+
! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i32
76+
! CHECK: %[[VAL_6:.*]] = arith.constant 2 : i32
77+
! CHECK: %[[VAL_7:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_5]] dim %[[VAL_6]] : (!fir.box<!fir.array<?x?xi32>>, i32, i32) -> !hlfir.expr<?x?xi32>
78+
! CHECK: hlfir.assign %[[VAL_7]] to %[[VAL_3]]#0 : !hlfir.expr<?x?xi32>, !fir.box<!fir.array<?x?xi32>>
79+
! CHECK: hlfir.destroy %[[VAL_7]] : !hlfir.expr<?x?xi32>
80+
! CHECK: return
81+
! CHECK: }
82+
83+
! 2d shift by array
84+
subroutine cshift5(a, s)
85+
integer :: a(:,:), s(:)
86+
a = CSHIFT(a, s)
87+
end subroutine
88+
! CHECK-LABEL: func.func @_QPcshift5(
89+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "a"},
90+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "s"}) {
91+
! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope
92+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]
93+
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]
94+
! CHECK: %[[VAL_5:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_4]]#0 : (!fir.box<!fir.array<?x?xi32>>, !fir.box<!fir.array<?xi32>>) -> !hlfir.expr<?x?xi32>
95+
! CHECK: hlfir.assign %[[VAL_5]] to %[[VAL_3]]#0 : !hlfir.expr<?x?xi32>, !fir.box<!fir.array<?x?xi32>>
96+
! CHECK: hlfir.destroy %[[VAL_5]] : !hlfir.expr<?x?xi32>
97+
! CHECK: return
98+
! CHECK: }
99+
100+
! 2d shift by array expr
101+
subroutine cshift6(a, s)
102+
integer :: a(:,:), s(:)
103+
a = CSHIFT(a, s + 1)
104+
end subroutine
105+
! CHECK-LABEL: func.func @_QPcshift6(
106+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "a"},
107+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "s"}) {
108+
! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope
109+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]
110+
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]
111+
! CHECK: %[[VAL_5:.*]] = arith.constant 1 : i32
112+
! CHECK: %[[VAL_6:.*]] = arith.constant 0 : index
113+
! CHECK: %[[VAL_7:.*]]:3 = fir.box_dims %[[VAL_4]]#0, %[[VAL_6]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)
114+
! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_7]]#1 : (index) -> !fir.shape<1>
115+
! CHECK: %[[VAL_9:.*]] = hlfir.elemental %[[VAL_8]] unordered : (!fir.shape<1>) -> !hlfir.expr<?xi32>
116+
! CHECK: %[[VAL_14:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_9]] : (!fir.box<!fir.array<?x?xi32>>, !hlfir.expr<?xi32>) -> !hlfir.expr<?x?xi32>
117+
! CHECK: hlfir.assign %[[VAL_14]] to %[[VAL_3]]#0 : !hlfir.expr<?x?xi32>, !fir.box<!fir.array<?x?xi32>>
118+
! CHECK: hlfir.destroy %[[VAL_14]] : !hlfir.expr<?x?xi32>
119+
! CHECK: hlfir.destroy %[[VAL_9]] : !hlfir.expr<?xi32>
120+
! CHECK: return
121+
! CHECK: }
122+
123+
! 1d character(10,2) shift by scalar
124+
subroutine cshift7(a, s)
125+
character(10,2) :: a(:)
126+
a = CSHIFT(a, 2)
127+
end subroutine
128+
! CHECK-LABEL: func.func @_QPcshift7(
129+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.char<2,10>>> {fir.bindc_name = "a"},
130+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}) {
131+
! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope
132+
! CHECK: %[[VAL_3:.*]] = arith.constant 10 : index
133+
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_0]]
134+
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_1]]
135+
! CHECK: %[[VAL_6:.*]] = arith.constant 2 : i32
136+
! CHECK: %[[VAL_7:.*]] = hlfir.cshift %[[VAL_4]]#0 %[[VAL_6]] : (!fir.box<!fir.array<?x!fir.char<2,10>>>, i32) -> !hlfir.expr<?x!fir.char<2,10>>
137+
! CHECK: hlfir.assign %[[VAL_7]] to %[[VAL_4]]#0 : !hlfir.expr<?x!fir.char<2,10>>, !fir.box<!fir.array<?x!fir.char<2,10>>>
138+
! CHECK: hlfir.destroy %[[VAL_7]] : !hlfir.expr<?x!fir.char<2,10>>
139+
! CHECK: return
140+
! CHECK: }
141+
142+
! 1d character(*) shift by scalar
143+
subroutine cshift8(a, s)
144+
character(*) :: a(:)
145+
a = CSHIFT(a, 2)
146+
end subroutine
147+
! CHECK-LABEL: func.func @_QPcshift8(
148+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_name = "a"},
149+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}) {
150+
! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope
151+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]
152+
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]
153+
! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i32
154+
! CHECK: %[[VAL_6:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_5]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>, i32) -> !hlfir.expr<?x!fir.char<1,?>>
155+
! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_3]]#0 : !hlfir.expr<?x!fir.char<1,?>>, !fir.box<!fir.array<?x!fir.char<1,?>>>
156+
! CHECK: hlfir.destroy %[[VAL_6]] : !hlfir.expr<?x!fir.char<1,?>>
157+
! CHECK: return
158+
! CHECK: }
159+
160+
! 1d type(t) shift by scalar
161+
subroutine cshift9(a, s)
162+
use types
163+
type(t) :: a(:)
164+
a = CSHIFT(a, 2)
165+
end subroutine
166+
! CHECK-LABEL: func.func @_QPcshift9(
167+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMtypesTt>>> {fir.bindc_name = "a"},
168+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}) {
169+
! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope
170+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]
171+
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]
172+
! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i32
173+
! CHECK: %[[VAL_6:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_5]] : (!fir.box<!fir.array<?x!fir.type<_QMtypesTt>>>, i32) -> !hlfir.expr<?x!fir.type<_QMtypesTt>>
174+
! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_3]]#0 : !hlfir.expr<?x!fir.type<_QMtypesTt>>, !fir.box<!fir.array<?x!fir.type<_QMtypesTt>>>
175+
! CHECK: hlfir.destroy %[[VAL_6]] : !hlfir.expr<?x!fir.type<_QMtypesTt>>
176+
! CHECK: return
177+
! CHECK: }
178+
179+
! 1d class(t) shift by scalar
180+
subroutine cshift10(a, s)
181+
use types
182+
class(t), allocatable :: a(:)
183+
a = CSHIFT(a, 2)
184+
end subroutine
185+
! CHECK-LABEL: func.func @_QPcshift10(
186+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>> {fir.bindc_name = "a"},
187+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}) {
188+
! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope
189+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]
190+
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]
191+
! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i32
192+
! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>>
193+
! CHECK: %[[VAL_7:.*]] = hlfir.cshift %[[VAL_6]] %[[VAL_5]] : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>, i32) -> !hlfir.expr<?x!fir.type<_QMtypesTt>?>
194+
! CHECK: hlfir.assign %[[VAL_7]] to %[[VAL_3]]#0 realloc : !hlfir.expr<?x!fir.type<_QMtypesTt>?>, !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>>
195+
! CHECK: hlfir.destroy %[[VAL_7]] : !hlfir.expr<?x!fir.type<_QMtypesTt>?>
196+
! CHECK: return
197+
! CHECK: }
198+
199+
! 1d shift by scalar with variable dim
200+
subroutine cshift11(a, s, d)
201+
integer :: a(:), s, d
202+
a = CSHIFT(a, 2, d)
203+
end subroutine
204+
! CHECK-LABEL: func.func @_QPcshift11(
205+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},
206+
! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"},
207+
! CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<i32> {fir.bindc_name = "d"}) {
208+
! CHECK: %[[VAL_3:.*]] = fir.dummy_scope : !fir.dscope
209+
! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %[[VAL_3]] {uniq_name = "_QFcshift11Ea"} : (!fir.box<!fir.array<?xi32>>, !fir.dscope) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
210+
! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_2]] dummy_scope %[[VAL_3]] {uniq_name = "_QFcshift11Ed"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
211+
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_1]] dummy_scope %[[VAL_3]] {uniq_name = "_QFcshift11Es"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)
212+
! CHECK: %[[VAL_7:.*]] = arith.constant 2 : i32
213+
! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<i32>
214+
! CHECK: %[[VAL_9:.*]] = hlfir.cshift %[[VAL_4]]#0 %[[VAL_7]] dim %[[VAL_8]] : (!fir.box<!fir.array<?xi32>>, i32, i32) -> !hlfir.expr<?xi32>
215+
! CHECK: hlfir.assign %[[VAL_9]] to %[[VAL_4]]#0 : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>>
216+
! CHECK: hlfir.destroy %[[VAL_9]] : !hlfir.expr<?xi32>
217+
! CHECK: return
218+
! CHECK: }

flang/test/Lower/HLFIR/poly_expr_for_nonpoly_dummy.f90

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,9 @@ subroutine test1(x)
1717
call callee(cshift(x, 1))
1818
end subroutine test1
1919
! CHECK-LABEL: func.func @_QPtest1(
20-
! CHECK: %[[VAL_21:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {uniq_name = ".tmp.intrinsic_result"} : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>, !fir.shift<1>) -> (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>, !fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>)
21-
! CHECK: %[[VAL_22:.*]] = arith.constant true
22-
! CHECK: %[[VAL_23:.*]] = hlfir.as_expr %[[VAL_21]]#0 move %[[VAL_22]] : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>, i1) -> !hlfir.expr<?x!fir.type<_QMtypesTt>?>
23-
! CHECK: %[[VAL_24:.*]] = arith.constant 0 : index
24-
! CHECK: %[[VAL_25:.*]]:3 = fir.box_dims %[[VAL_21]]#0, %[[VAL_24]] : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>, index) -> (index, index, index)
25-
! CHECK: %[[VAL_26:.*]] = fir.shape %[[VAL_25]]#1 : (index) -> !fir.shape<1>
20+
! CHECK: %[[VAL_4:.*]] = arith.constant 1 : i32
21+
! CHECK: %[[VAL_23:.*]] = hlfir.cshift %{{.*}} %[[VAL_4]] : (!fir.class<!fir.array<?x!fir.type<_QMtypesTt>>>, i32) -> !hlfir.expr<?x!fir.type<_QMtypesTt>?>
22+
! CHECK: %[[VAL_26:.*]] = hlfir.shape_of %[[VAL_23]] : (!hlfir.expr<?x!fir.type<_QMtypesTt>?>) -> !fir.shape<1>
2623
! CHECK: %[[VAL_27:.*]]:3 = hlfir.associate %[[VAL_23]](%[[VAL_26]]) {adapt.valuebyref} : (!hlfir.expr<?x!fir.type<_QMtypesTt>?>, !fir.shape<1>) -> (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>, !fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>, i1)
2724
! CHECK: %[[VAL_28:.*]] = fir.rebox %[[VAL_27]]#0 : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>) -> !fir.box<!fir.array<?x!fir.type<_QMtypesTt>>>
2825
! CHECK: %[[VAL_29:.*]]:2 = hlfir.copy_in %[[VAL_28]] to %[[TMP_BOX:.*]] : (!fir.box<!fir.array<?x!fir.type<_QMtypesTt>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>>) -> (!fir.box<!fir.array<?x!fir.type<_QMtypesTt>>>, i1)

0 commit comments

Comments
 (0)