@@ -214,24 +214,6 @@ static void threadPrivatizeVars(Fortran::lower::AbstractConverter &converter,
214
214
firOpBuilder.restoreInsertionPoint (insPt);
215
215
}
216
216
217
- static mlir::Type getLoopVarType (Fortran::lower::AbstractConverter &converter,
218
- std::size_t loopVarTypeSize) {
219
- // OpenMP runtime requires 32-bit or 64-bit loop variables.
220
- loopVarTypeSize = loopVarTypeSize * 8 ;
221
- if (loopVarTypeSize < 32 ) {
222
- loopVarTypeSize = 32 ;
223
- } else if (loopVarTypeSize > 64 ) {
224
- loopVarTypeSize = 64 ;
225
- mlir::emitWarning (converter.getCurrentLocation (),
226
- " OpenMP loop iteration variable cannot have more than 64 "
227
- " bits size and will be narrowed into 64 bits." );
228
- }
229
- assert ((loopVarTypeSize == 32 || loopVarTypeSize == 64 ) &&
230
- " OpenMP loop iteration variable size must be transformed into 32-bit "
231
- " or 64-bit" );
232
- return converter.getFirOpBuilder ().getIntegerType (loopVarTypeSize);
233
- }
234
-
235
217
static mlir::Operation *
236
218
createAndSetPrivatizedLoopVar (Fortran::lower::AbstractConverter &converter,
237
219
mlir::Location loc, mlir::Value indexVal,
@@ -570,6 +552,7 @@ genParallelOp(Fortran::lower::AbstractConverter &converter,
570
552
mlir::omp::ClauseProcBindKindAttr procBindKindAttr;
571
553
llvm::SmallVector<mlir::Value> allocateOperands, allocatorOperands,
572
554
reductionVars;
555
+ llvm::SmallVector<mlir::Type> reductionTypes;
573
556
llvm::SmallVector<mlir::Attribute> reductionDeclSymbols;
574
557
llvm::SmallVector<const Fortran::semantics::Symbol *> reductionSymbols;
575
558
@@ -580,13 +563,8 @@ genParallelOp(Fortran::lower::AbstractConverter &converter,
580
563
cp.processDefault ();
581
564
cp.processAllocate (allocatorOperands, allocateOperands);
582
565
if (!outerCombined)
583
- cp.processReduction (currentLocation, reductionVars, reductionDeclSymbols,
584
- &reductionSymbols);
585
-
586
- llvm::SmallVector<mlir::Type> reductionTypes;
587
- reductionTypes.reserve (reductionVars.size ());
588
- llvm::transform (reductionVars, std::back_inserter (reductionTypes),
589
- [](mlir::Value v) { return v.getType (); });
566
+ cp.processReduction (currentLocation, reductionVars, reductionTypes,
567
+ reductionDeclSymbols, &reductionSymbols);
590
568
591
569
auto reductionCallback = [&](mlir::Operation *op) {
592
570
llvm::SmallVector<mlir::Location> locs (reductionVars.size (),
@@ -1469,25 +1447,6 @@ genOMP(Fortran::lower::AbstractConverter &converter,
1469
1447
standaloneConstruct.u );
1470
1448
}
1471
1449
1472
- static void convertLoopBounds (Fortran::lower::AbstractConverter &converter,
1473
- mlir::Location loc,
1474
- llvm::SmallVectorImpl<mlir::Value> &lowerBound,
1475
- llvm::SmallVectorImpl<mlir::Value> &upperBound,
1476
- llvm::SmallVectorImpl<mlir::Value> &step,
1477
- std::size_t loopVarTypeSize) {
1478
- fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
1479
- // The types of lower bound, upper bound, and step are converted into the
1480
- // type of the loop variable if necessary.
1481
- mlir::Type loopVarType = getLoopVarType (converter, loopVarTypeSize);
1482
- for (unsigned it = 0 ; it < (unsigned )lowerBound.size (); it++) {
1483
- lowerBound[it] =
1484
- firOpBuilder.createConvert (loc, loopVarType, lowerBound[it]);
1485
- upperBound[it] =
1486
- firOpBuilder.createConvert (loc, loopVarType, upperBound[it]);
1487
- step[it] = firOpBuilder.createConvert (loc, loopVarType, step[it]);
1488
- }
1489
- }
1490
-
1491
1450
static llvm::SmallVector<const Fortran::semantics::Symbol *>
1492
1451
genLoopVars (mlir::Operation *op, Fortran::lower::AbstractConverter &converter,
1493
1452
mlir::Location &loc,
@@ -1583,16 +1542,15 @@ createSimdLoop(Fortran::lower::AbstractConverter &converter,
1583
1542
llvm::SmallVector<mlir::Value> lowerBound, upperBound, step, reductionVars;
1584
1543
llvm::SmallVector<mlir::Value> alignedVars, nontemporalVars;
1585
1544
llvm::SmallVector<const Fortran::semantics::Symbol *> iv;
1545
+ llvm::SmallVector<mlir::Type> reductionTypes;
1586
1546
llvm::SmallVector<mlir::Attribute> reductionDeclSymbols;
1587
1547
mlir::omp::ClauseOrderKindAttr orderClauseOperand;
1588
1548
mlir::IntegerAttr simdlenClauseOperand, safelenClauseOperand;
1589
- std::size_t loopVarTypeSize;
1590
1549
1591
1550
ClauseProcessor cp (converter, semaCtx, loopOpClauseList);
1592
- cp.processCollapse (loc, eval, lowerBound, upperBound, step, iv,
1593
- loopVarTypeSize);
1551
+ cp.processCollapse (loc, eval, lowerBound, upperBound, step, iv);
1594
1552
cp.processScheduleChunk (stmtCtx, scheduleChunkClauseOperand);
1595
- cp.processReduction (loc, reductionVars, reductionDeclSymbols);
1553
+ cp.processReduction (loc, reductionVars, reductionTypes, reductionDeclSymbols);
1596
1554
cp.processIf (clause::If::DirectiveNameModifier::Simd, ifClauseOperand);
1597
1555
cp.processSimdlen (simdlenClauseOperand);
1598
1556
cp.processSafelen (safelenClauseOperand);
@@ -1602,9 +1560,6 @@ createSimdLoop(Fortran::lower::AbstractConverter &converter,
1602
1560
Fortran::parser::OmpClause::Nontemporal,
1603
1561
Fortran::parser::OmpClause::Order>(loc, ompDirective);
1604
1562
1605
- convertLoopBounds (converter, loc, lowerBound, upperBound, step,
1606
- loopVarTypeSize);
1607
-
1608
1563
mlir::TypeRange resultType;
1609
1564
auto simdLoopOp = firOpBuilder.create <mlir::omp::SimdLoopOp>(
1610
1565
loc, resultType, lowerBound, upperBound, step, alignedVars,
@@ -1642,27 +1597,23 @@ static void createWsLoop(Fortran::lower::AbstractConverter &converter,
1642
1597
llvm::SmallVector<mlir::Value> lowerBound, upperBound, step, reductionVars;
1643
1598
llvm::SmallVector<mlir::Value> linearVars, linearStepVars;
1644
1599
llvm::SmallVector<const Fortran::semantics::Symbol *> iv;
1600
+ llvm::SmallVector<mlir::Type> reductionTypes;
1645
1601
llvm::SmallVector<mlir::Attribute> reductionDeclSymbols;
1646
1602
llvm::SmallVector<const Fortran::semantics::Symbol *> reductionSymbols;
1647
1603
mlir::omp::ClauseOrderKindAttr orderClauseOperand;
1648
1604
mlir::omp::ClauseScheduleKindAttr scheduleValClauseOperand;
1649
1605
mlir::UnitAttr nowaitClauseOperand, byrefOperand, scheduleSimdClauseOperand;
1650
1606
mlir::IntegerAttr orderedClauseOperand;
1651
1607
mlir::omp::ScheduleModifierAttr scheduleModClauseOperand;
1652
- std::size_t loopVarTypeSize;
1653
1608
1654
1609
ClauseProcessor cp (converter, semaCtx, beginClauseList);
1655
- cp.processCollapse (loc, eval, lowerBound, upperBound, step, iv,
1656
- loopVarTypeSize);
1610
+ cp.processCollapse (loc, eval, lowerBound, upperBound, step, iv);
1657
1611
cp.processScheduleChunk (stmtCtx, scheduleChunkClauseOperand);
1658
- cp.processReduction (loc, reductionVars, reductionDeclSymbols,
1612
+ cp.processReduction (loc, reductionVars, reductionTypes, reductionDeclSymbols,
1659
1613
&reductionSymbols);
1660
1614
cp.processTODO <Fortran::parser::OmpClause::Linear,
1661
1615
Fortran::parser::OmpClause::Order>(loc, ompDirective);
1662
1616
1663
- convertLoopBounds (converter, loc, lowerBound, upperBound, step,
1664
- loopVarTypeSize);
1665
-
1666
1617
if (ReductionProcessor::doReductionByRef (reductionVars))
1667
1618
byrefOperand = firOpBuilder.getUnitAttr ();
1668
1619
@@ -1703,11 +1654,6 @@ static void createWsLoop(Fortran::lower::AbstractConverter &converter,
1703
1654
auto *nestedEval = getCollapsedLoopEval (
1704
1655
eval, Fortran::lower::getCollapseValue (beginClauseList));
1705
1656
1706
- llvm::SmallVector<mlir::Type> reductionTypes;
1707
- reductionTypes.reserve (reductionVars.size ());
1708
- llvm::transform (reductionVars, std::back_inserter (reductionTypes),
1709
- [](mlir::Value v) { return v.getType (); });
1710
-
1711
1657
auto ivCallback = [&](mlir::Operation *op) {
1712
1658
return genLoopAndReductionVars (op, converter, loc, iv, reductionSymbols,
1713
1659
reductionTypes);
0 commit comments