@@ -486,11 +486,13 @@ struct IntrinsicLibrary {
486
486
void genRandomInit (llvm::ArrayRef<fir::ExtendedValue>);
487
487
void genRandomNumber (llvm::ArrayRef<fir::ExtendedValue>);
488
488
void genRandomSeed (llvm::ArrayRef<fir::ExtendedValue>);
489
+ fir::ExtendedValue genReshape (mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
489
490
fir::ExtendedValue genScan (mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
490
491
mlir::Value genSetExponent (mlir::Type resultType,
491
492
llvm::ArrayRef<mlir::Value> args);
492
493
fir::ExtendedValue genSize (mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
493
494
fir::ExtendedValue genSum (mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
495
+ fir::ExtendedValue genSpread (mlir::Type, llvm::ArrayRef<fir::ExtendedValue>);
494
496
void genSystemClock (llvm::ArrayRef<fir::ExtendedValue>);
495
497
fir::ExtendedValue genTransfer (mlir::Type,
496
498
llvm::ArrayRef<fir::ExtendedValue>);
@@ -729,6 +731,13 @@ static constexpr IntrinsicHandler handlers[]{
729
731
&I::genRandomSeed,
730
732
{{{" size" , asBox}, {" put" , asBox}, {" get" , asBox}}},
731
733
/* isElemental=*/ false },
734
+ {" reshape" ,
735
+ &I::genReshape,
736
+ {{{" source" , asBox},
737
+ {" shape" , asBox},
738
+ {" pad" , asBox, handleDynamicOptional},
739
+ {" order" , asBox, handleDynamicOptional}}},
740
+ /* isElemental=*/ false },
732
741
{" scan" ,
733
742
&I::genScan,
734
743
{{{" string" , asAddr},
@@ -743,6 +752,10 @@ static constexpr IntrinsicHandler handlers[]{
743
752
{" dim" , asAddr, handleDynamicOptional},
744
753
{" kind" , asValue}}},
745
754
/* isElemental=*/ false },
755
+ {" spread" ,
756
+ &I::genSpread,
757
+ {{{" source" , asAddr}, {" dim" , asValue}, {" ncopies" , asValue}}},
758
+ /* isElemental=*/ false },
746
759
{" sum" ,
747
760
&I::genSum,
748
761
{{{" array" , asBox},
@@ -2501,6 +2514,52 @@ void IntrinsicLibrary::genRandomSeed(llvm::ArrayRef<fir::ExtendedValue> args) {
2501
2514
Fortran::lower::genRandomSeed (builder, loc, -1 , mlir::Value{});
2502
2515
}
2503
2516
2517
+ // RESHAPE
2518
+ fir::ExtendedValue
2519
+ IntrinsicLibrary::genReshape (mlir::Type resultType,
2520
+ llvm::ArrayRef<fir::ExtendedValue> args) {
2521
+ assert (args.size () == 4 );
2522
+
2523
+ // Handle source argument
2524
+ mlir::Value source = builder.createBox (loc, args[0 ]);
2525
+
2526
+ // Handle shape argument
2527
+ mlir::Value shape = builder.createBox (loc, args[1 ]);
2528
+ assert (fir::BoxValue (shape).rank () == 1 );
2529
+ mlir::Type shapeTy = shape.getType ();
2530
+ mlir::Type shapeArrTy = fir::dyn_cast_ptrOrBoxEleTy (shapeTy);
2531
+ auto resultRank = shapeArrTy.cast <fir::SequenceType>().getShape ();
2532
+
2533
+ assert (resultRank[0 ] != fir::SequenceType::getUnknownExtent () &&
2534
+ " shape arg must have constant size" );
2535
+
2536
+ // Handle optional pad argument
2537
+ mlir::Value pad = isAbsent (args[2 ])
2538
+ ? builder.create <fir::AbsentOp>(
2539
+ loc, fir::BoxType::get (builder.getI1Type ()))
2540
+ : builder.createBox (loc, args[2 ]);
2541
+
2542
+ // Handle optional order argument
2543
+ mlir::Value order = isAbsent (args[3 ])
2544
+ ? builder.create <fir::AbsentOp>(
2545
+ loc, fir::BoxType::get (builder.getI1Type ()))
2546
+ : builder.createBox (loc, args[3 ]);
2547
+
2548
+ // Create mutable fir.box to be passed to the runtime for the result.
2549
+ mlir::Type type = builder.getVarLenSeqTy (resultType, resultRank[0 ]);
2550
+ fir::MutableBoxValue resultMutableBox =
2551
+ fir::factory::createTempMutableBox (builder, loc, type);
2552
+
2553
+ mlir::Value resultIrBox =
2554
+ fir::factory::getMutableIRBox (builder, loc, resultMutableBox);
2555
+
2556
+ fir::runtime::genReshape (builder, loc, resultIrBox, source, shape, pad,
2557
+ order);
2558
+
2559
+ return readAndAddCleanUp (resultMutableBox, resultType,
2560
+ " unexpected result for RESHAPE" );
2561
+ }
2562
+
2504
2563
// SCAN
2505
2564
fir::ExtendedValue
2506
2565
IntrinsicLibrary::genScan (mlir::Type resultType,
@@ -2589,6 +2648,38 @@ mlir::Value IntrinsicLibrary::genSetExponent(mlir::Type resultType,
2589
2648
fir::getBase (args[1 ])));
2590
2649
}
2591
2650
2651
+ // SPREAD
2652
+ fir::ExtendedValue
2653
+ IntrinsicLibrary::genSpread (mlir::Type resultType,
2654
+ llvm::ArrayRef<fir::ExtendedValue> args) {
2655
+
2656
+ assert (args.size () == 3 );
2657
+
2658
+ // Handle source argument
2659
+ mlir::Value source = builder.createBox (loc, args[0 ]);
2660
+ fir::BoxValue sourceTmp = source;
2661
+ unsigned sourceRank = sourceTmp.rank ();
2662
+
2663
+ // Handle Dim argument
2664
+ mlir::Value dim = fir::getBase (args[1 ]);
2665
+
2666
+ // Handle ncopies argument
2667
+ mlir::Value ncopies = fir::getBase (args[2 ]);
2668
+
2669
+ // Generate result descriptor
2670
+ mlir::Type resultArrayType =
2671
+ builder.getVarLenSeqTy (resultType, sourceRank + 1 );
2672
+ fir::MutableBoxValue resultMutableBox =
2673
+ fir::factory::createTempMutableBox (builder, loc, resultArrayType);
2674
+ mlir::Value resultIrBox =
2675
+ fir::factory::getMutableIRBox (builder, loc, resultMutableBox);
2676
+
2677
+ fir::runtime::genSpread (builder, loc, resultIrBox, source, dim, ncopies);
2678
+
2679
+ return readAndAddCleanUp (resultMutableBox, resultType,
2680
+ " unexpected result for SPREAD" );
2681
+ }
2682
+
2592
2683
// SUM
2593
2684
fir::ExtendedValue
2594
2685
IntrinsicLibrary::genSum (mlir::Type resultType,
0 commit comments