@@ -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,
@@ -568,6 +550,7 @@ genParallelOp(Fortran::lower::AbstractConverter &converter,
568
550
mlir::omp::ClauseProcBindKindAttr procBindKindAttr;
569
551
llvm::SmallVector<mlir::Value> allocateOperands, allocatorOperands,
570
552
reductionVars;
553
+ llvm::SmallVector<mlir::Type> reductionTypes;
571
554
llvm::SmallVector<mlir::Attribute> reductionDeclSymbols;
572
555
llvm::SmallVector<const Fortran::semantics::Symbol *> reductionSymbols;
573
556
@@ -578,13 +561,8 @@ genParallelOp(Fortran::lower::AbstractConverter &converter,
578
561
cp.processDefault ();
579
562
cp.processAllocate (allocatorOperands, allocateOperands);
580
563
if (!outerCombined)
581
- cp.processReduction (currentLocation, reductionVars, reductionDeclSymbols,
582
- &reductionSymbols);
583
-
584
- llvm::SmallVector<mlir::Type> reductionTypes;
585
- reductionTypes.reserve (reductionVars.size ());
586
- llvm::transform (reductionVars, std::back_inserter (reductionTypes),
587
- [](mlir::Value v) { return v.getType (); });
564
+ cp.processReduction (currentLocation, reductionVars, reductionTypes,
565
+ reductionDeclSymbols, &reductionSymbols);
588
566
589
567
auto reductionCallback = [&](mlir::Operation *op) {
590
568
llvm::SmallVector<mlir::Location> locs (reductionVars.size (),
@@ -1468,25 +1446,6 @@ genOMP(Fortran::lower::AbstractConverter &converter,
1468
1446
standaloneConstruct.u );
1469
1447
}
1470
1448
1471
- static void convertLoopBounds (Fortran::lower::AbstractConverter &converter,
1472
- mlir::Location loc,
1473
- llvm::SmallVectorImpl<mlir::Value> &lowerBound,
1474
- llvm::SmallVectorImpl<mlir::Value> &upperBound,
1475
- llvm::SmallVectorImpl<mlir::Value> &step,
1476
- std::size_t loopVarTypeSize) {
1477
- fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder ();
1478
- // The types of lower bound, upper bound, and step are converted into the
1479
- // type of the loop variable if necessary.
1480
- mlir::Type loopVarType = getLoopVarType (converter, loopVarTypeSize);
1481
- for (unsigned it = 0 ; it < (unsigned )lowerBound.size (); it++) {
1482
- lowerBound[it] =
1483
- firOpBuilder.createConvert (loc, loopVarType, lowerBound[it]);
1484
- upperBound[it] =
1485
- firOpBuilder.createConvert (loc, loopVarType, upperBound[it]);
1486
- step[it] = firOpBuilder.createConvert (loc, loopVarType, step[it]);
1487
- }
1488
- }
1489
-
1490
1449
static llvm::SmallVector<const Fortran::semantics::Symbol *>
1491
1450
genLoopVars (mlir::Operation *op, Fortran::lower::AbstractConverter &converter,
1492
1451
mlir::Location &loc,
@@ -1582,16 +1541,15 @@ createSimdLoop(Fortran::lower::AbstractConverter &converter,
1582
1541
llvm::SmallVector<mlir::Value> lowerBound, upperBound, step, reductionVars;
1583
1542
llvm::SmallVector<mlir::Value> alignedVars, nontemporalVars;
1584
1543
llvm::SmallVector<const Fortran::semantics::Symbol *> iv;
1544
+ llvm::SmallVector<mlir::Type> reductionTypes;
1585
1545
llvm::SmallVector<mlir::Attribute> reductionDeclSymbols;
1586
1546
mlir::omp::ClauseOrderKindAttr orderClauseOperand;
1587
1547
mlir::IntegerAttr simdlenClauseOperand, safelenClauseOperand;
1588
- std::size_t loopVarTypeSize;
1589
1548
1590
1549
ClauseProcessor cp (converter, semaCtx, loopOpClauseList);
1591
- cp.processCollapse (loc, eval, lowerBound, upperBound, step, iv,
1592
- loopVarTypeSize);
1550
+ cp.processCollapse (loc, eval, lowerBound, upperBound, step, iv);
1593
1551
cp.processScheduleChunk (stmtCtx, scheduleChunkClauseOperand);
1594
- cp.processReduction (loc, reductionVars, reductionDeclSymbols);
1552
+ cp.processReduction (loc, reductionVars, reductionTypes, reductionDeclSymbols);
1595
1553
cp.processIf (clause::If::DirectiveNameModifier::Simd, ifClauseOperand);
1596
1554
cp.processSimdlen (simdlenClauseOperand);
1597
1555
cp.processSafelen (safelenClauseOperand);
@@ -1601,9 +1559,6 @@ createSimdLoop(Fortran::lower::AbstractConverter &converter,
1601
1559
Fortran::parser::OmpClause::Nontemporal,
1602
1560
Fortran::parser::OmpClause::Order>(loc, ompDirective);
1603
1561
1604
- convertLoopBounds (converter, loc, lowerBound, upperBound, step,
1605
- loopVarTypeSize);
1606
-
1607
1562
mlir::TypeRange resultType;
1608
1563
auto simdLoopOp = firOpBuilder.create <mlir::omp::SimdLoopOp>(
1609
1564
loc, resultType, lowerBound, upperBound, step, alignedVars,
@@ -1641,27 +1596,23 @@ static void createWsLoop(Fortran::lower::AbstractConverter &converter,
1641
1596
llvm::SmallVector<mlir::Value> lowerBound, upperBound, step, reductionVars;
1642
1597
llvm::SmallVector<mlir::Value> linearVars, linearStepVars;
1643
1598
llvm::SmallVector<const Fortran::semantics::Symbol *> iv;
1599
+ llvm::SmallVector<mlir::Type> reductionTypes;
1644
1600
llvm::SmallVector<mlir::Attribute> reductionDeclSymbols;
1645
1601
llvm::SmallVector<const Fortran::semantics::Symbol *> reductionSymbols;
1646
1602
mlir::omp::ClauseOrderKindAttr orderClauseOperand;
1647
1603
mlir::omp::ClauseScheduleKindAttr scheduleValClauseOperand;
1648
1604
mlir::UnitAttr nowaitClauseOperand, byrefOperand, scheduleSimdClauseOperand;
1649
1605
mlir::IntegerAttr orderedClauseOperand;
1650
1606
mlir::omp::ScheduleModifierAttr scheduleModClauseOperand;
1651
- std::size_t loopVarTypeSize;
1652
1607
1653
1608
ClauseProcessor cp (converter, semaCtx, beginClauseList);
1654
- cp.processCollapse (loc, eval, lowerBound, upperBound, step, iv,
1655
- loopVarTypeSize);
1609
+ cp.processCollapse (loc, eval, lowerBound, upperBound, step, iv);
1656
1610
cp.processScheduleChunk (stmtCtx, scheduleChunkClauseOperand);
1657
- cp.processReduction (loc, reductionVars, reductionDeclSymbols,
1611
+ cp.processReduction (loc, reductionVars, reductionTypes, reductionDeclSymbols,
1658
1612
&reductionSymbols);
1659
1613
cp.processTODO <Fortran::parser::OmpClause::Linear,
1660
1614
Fortran::parser::OmpClause::Order>(loc, ompDirective);
1661
1615
1662
- convertLoopBounds (converter, loc, lowerBound, upperBound, step,
1663
- loopVarTypeSize);
1664
-
1665
1616
if (ReductionProcessor::doReductionByRef (reductionVars))
1666
1617
byrefOperand = firOpBuilder.getUnitAttr ();
1667
1618
@@ -1702,11 +1653,6 @@ static void createWsLoop(Fortran::lower::AbstractConverter &converter,
1702
1653
auto *nestedEval = getCollapsedLoopEval (
1703
1654
eval, Fortran::lower::getCollapseValue (beginClauseList));
1704
1655
1705
- llvm::SmallVector<mlir::Type> reductionTypes;
1706
- reductionTypes.reserve (reductionVars.size ());
1707
- llvm::transform (reductionVars, std::back_inserter (reductionTypes),
1708
- [](mlir::Value v) { return v.getType (); });
1709
-
1710
1656
auto ivCallback = [&](mlir::Operation *op) {
1711
1657
return genLoopAndReductionVars (op, converter, loc, iv, reductionSymbols,
1712
1658
reductionTypes);
0 commit comments