Skip to content

Commit 733f50e

Browse files
committed
Update flang
1 parent 0a6e948 commit 733f50e

File tree

10 files changed

+189
-178
lines changed

10 files changed

+189
-178
lines changed

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -390,10 +390,10 @@ class FIROpConversion : public mlir::ConvertOpToLLVMPattern<FromOp> {
390390
this->getTypeConverter());
391391
}
392392

393-
void attachTBAATag(mlir::LLVM::AliasAnalysisOpInterface op,
394-
mlir::Type baseFIRType, mlir::Type accessFIRType,
395-
mlir::LLVM::GEPOp gep) const {
396-
lowerTy().attachTBAATag(op, baseFIRType, accessFIRType, gep);
393+
void attachTBAATag(mlir::Operation *op, mlir::Type baseFIRType,
394+
mlir::Type accessFIRType, mlir::LLVM::GEPOp gep) const {
395+
if (auto iface = mlir::dyn_cast<mlir::LLVM::AliasAnalysisOpInterface>(op))
396+
lowerTy().attachTBAATag(iface, baseFIRType, accessFIRType, gep);
397397
}
398398

399399
const fir::FIRToLLVMPassOptions &options;
@@ -3105,9 +3105,11 @@ struct LoadOpConversion : public FIROpConversion<fir::LoadOp> {
31053105
TODO(loc, "loading or assumed rank fir.box");
31063106
auto boxValue =
31073107
rewriter.create<mlir::LLVM::LoadOp>(loc, llvmLoadTy, inputBoxStorage);
3108-
if (std::optional<mlir::ArrayAttr> optionalTag = load.getTbaa())
3109-
boxValue.setTBAATags(*optionalTag);
3110-
else
3108+
if (std::optional<mlir::ArrayAttr> optionalTag = load.getTbaa()) {
3109+
if (auto iface = mlir::dyn_cast<mlir::LLVM::AliasAnalysisOpInterface>(
3110+
boxValue.getOperation()))
3111+
iface.setTBAATags(*optionalTag);
3112+
} else
31113113
attachTBAATag(boxValue, boxTy, boxTy, nullptr);
31123114
auto newBoxStorage =
31133115
genAllocaWithType(loc, llvmLoadTy, defaultAlign, rewriter);
@@ -3118,9 +3120,11 @@ struct LoadOpConversion : public FIROpConversion<fir::LoadOp> {
31183120
} else {
31193121
auto loadOp = rewriter.create<mlir::LLVM::LoadOp>(
31203122
load.getLoc(), llvmLoadTy, adaptor.getOperands(), load->getAttrs());
3121-
if (std::optional<mlir::ArrayAttr> optionalTag = load.getTbaa())
3122-
loadOp.setTBAATags(*optionalTag);
3123-
else
3123+
if (std::optional<mlir::ArrayAttr> optionalTag = load.getTbaa()) {
3124+
if (auto iface = mlir::dyn_cast<mlir::LLVM::AliasAnalysisOpInterface>(
3125+
loadOp.getOperation()))
3126+
iface.setTBAATags(*optionalTag);
3127+
} else
31243128
attachTBAATag(loadOp, load.getType(), load.getType(), nullptr);
31253129
rewriter.replaceOp(load, loadOp.getResult());
31263130
}
@@ -3364,9 +3368,11 @@ struct StoreOpConversion : public FIROpConversion<fir::StoreOp> {
33643368
newStoreOp = rewriter.create<mlir::LLVM::StoreOp>(
33653369
loc, adaptor.getOperands()[0], adaptor.getOperands()[1]);
33663370
}
3367-
if (std::optional<mlir::ArrayAttr> optionalTag = store.getTbaa())
3368-
newStoreOp.setTBAATags(*optionalTag);
3369-
else
3371+
if (std::optional<mlir::ArrayAttr> optionalTag = store.getTbaa()) {
3372+
if (auto iface = mlir::dyn_cast<mlir::LLVM::AliasAnalysisOpInterface>(
3373+
newStoreOp.getOperation()))
3374+
iface.setTBAATags(*optionalTag);
3375+
} else
33703376
attachTBAATag(newStoreOp, storeTy, storeTy, nullptr);
33713377
rewriter.eraseOp(store);
33723378
return mlir::success();
@@ -3883,6 +3889,7 @@ class FIRToLLVMLowering
38833889
mlir::populateComplexToLLVMConversionPatterns(typeConverter, pattern);
38843890
mlir::populateVectorToLLVMConversionPatterns(typeConverter, pattern);
38853891
mlir::ConversionTarget target{*context};
3892+
target.addLegalDialect<mlir::ptr::PtrDialect>();
38863893
target.addLegalDialect<mlir::LLVM::LLVMDialect>();
38873894
// The OpenMP dialect is legal for Operations without regions, for those
38883895
// which contains regions it is legal if the region contains only the

flang/lib/Optimizer/Support/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ add_flang_library(FIRSupport
2020
MLIROpenACCToLLVMIRTranslation
2121
MLIROpenMPToLLVMIRTranslation
2222
MLIRLLVMToLLVMIRTranslation
23+
MLIRPtrToLLVMIRTranslation
2324
MLIRTargetLLVMIRExport
2425
MLIRTargetLLVMIRImport
2526

flang/lib/Optimizer/Support/InitFIR.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
1212
#include "mlir/Target/LLVMIR/Dialect/OpenACC/OpenACCToLLVMIRTranslation.h"
1313
#include "mlir/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.h"
14+
#include "mlir/Target/LLVMIR/Dialect/Ptr/PtrToLLVMIRTranslation.h"
1415

1516
void fir::support::registerLLVMTranslation(mlir::MLIRContext &context) {
1617
mlir::DialectRegistry registry;
@@ -22,5 +23,7 @@ void fir::support::registerLLVMTranslation(mlir::MLIRContext &context) {
2223
registerLLVMDialectTranslation(registry);
2324
// Register builtin dialect interface.
2425
registerBuiltinDialectTranslation(registry);
26+
// Register ptr dialect interface.
27+
registerPtrDialectTranslation(registry);
2528
context.appendDialectRegistry(registry);
2629
}

flang/test/Fir/convert-to-llvm-openmp-and-fir.fir

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@ func.func @_QPsb1(%arg0: !fir.ref<i32> {fir.bindc_name = "n"}, %arg1: !fir.ref<!
2929
// CHECK: omp.parallel {
3030
// CHECK: %[[ONE_3:.*]] = llvm.mlir.constant(1 : i64) : i64
3131
// CHECK: %[[I_VAR:.*]] = llvm.alloca %[[ONE_3]] x i32 {pinned} : (i64) -> !llvm.ptr
32-
// CHECK: %[[N:.*]] = llvm.load %[[N_REF]] : !llvm.ptr -> i32
32+
// CHECK: %[[N:.*]] = ptr.load %[[N_REF]] : !llvm.ptr -> i32
3333
// CHECK: omp.wsloop nowait
3434
// CHECK-SAME: for (%[[I:.*]]) : i32 = (%[[ONE_2]]) to (%[[N]]) inclusive step (%[[ONE_2]]) {
35-
// CHECK: llvm.store %[[I]], %[[I_VAR]] : i32, !llvm.ptr
36-
// CHECK: %[[I1:.*]] = llvm.load %[[I_VAR]] : !llvm.ptr -> i32
35+
// CHECK: ptr.store %[[I]], %[[I_VAR]] : i32, !llvm.ptr
36+
// CHECK: %[[I1:.*]] = ptr.load %[[I_VAR]] : !llvm.ptr -> i32
3737
// CHECK: %[[I1_EXT:.*]] = llvm.sext %[[I1]] : i32 to i64
3838
// CHECK: %[[I_CSTYLE:.*]] = llvm.sub %[[I1_EXT]], %[[ONE_1]] : i64
3939
// CHECK: %[[ARR_I_REF:.*]] = llvm.getelementptr %[[ARR_REF]][%[[I_CSTYLE]]] : (!llvm.ptr, i64) -> !llvm.ptr
40-
// CHECK: llvm.store %[[I1]], %[[ARR_I_REF]] : i32, !llvm.ptr
40+
// CHECK: ptr.store %[[I1]], %[[ARR_I_REF]] : i32, !llvm.ptr
4141
// CHECK: omp.yield
4242
// CHECK: }
4343
// CHECK: omp.terminator
@@ -63,8 +63,8 @@ func.func @_QPsb2(%arg0: !fir.ref<i32> {fir.bindc_name = "x"}, %arg1: !fir.ref<i
6363
// CHECK-SAME: %[[X_REF:.*]]: !llvm.ptr {fir.bindc_name = "x"}, %[[N_REF:.*]]: !llvm.ptr {fir.bindc_name = "n"}) {
6464
// CHECK: omp.parallel {
6565
// CHECK: omp.master {
66-
// CHECK: %[[N:.*]] = llvm.load %[[N_REF]] : !llvm.ptr -> i32
67-
// CHECK: llvm.store %[[N]], %[[X_REF]] : i32, !llvm.ptr
66+
// CHECK: %[[N:.*]] = ptr.load %[[N_REF]] : !llvm.ptr -> i32
67+
// CHECK: ptr.store %[[N]], %[[X_REF]] : i32, !llvm.ptr
6868
// CHECK: omp.terminator
6969
// CHECK: }
7070
// CHECK: omp.terminator
@@ -99,7 +99,7 @@ func.func @_QPsb(%arr: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arr"}) {
9999
// CHECK: %[[C1:.*]] = llvm.mlir.constant(1 : i32) : i32
100100
// CHECK: %[[C50:.*]] = llvm.mlir.constant(50 : i32) : i32
101101
// CHECK: omp.wsloop for (%[[INDX:.*]]) : i32 = (%[[C1]]) to (%[[C50]]) inclusive step (%[[C1]]) {
102-
// CHECK: llvm.store %[[INDX]], %{{.*}} : i32, !llvm.ptr
102+
// CHECK: ptr.store %[[INDX]], %{{.*}} : i32, !llvm.ptr
103103
// CHECK: omp.yield
104104
// CHECK: omp.terminator
105105
// CHECK: llvm.return
@@ -201,15 +201,15 @@ func.func @_QPsimd1(%arg0: !fir.ref<i32> {fir.bindc_name = "n"}, %arg1: !fir.ref
201201
// CHECK: omp.parallel {
202202
// CHECK: %[[ONE_3:.*]] = llvm.mlir.constant(1 : i64) : i64
203203
// CHECK: %[[I_VAR:.*]] = llvm.alloca %[[ONE_3]] x i32 {pinned} : (i64) -> !llvm.ptr
204-
// CHECK: %[[N:.*]] = llvm.load %[[N_REF]] : !llvm.ptr -> i32
204+
// CHECK: %[[N:.*]] = ptr.load %[[N_REF]] : !llvm.ptr -> i32
205205
// CHECK: omp.simdloop
206206
// CHECK-SAME: (%[[I:.*]]) : i32 = (%[[ONE_2]]) to (%[[N]]) step (%[[ONE_2]]) {
207-
// CHECK: llvm.store %[[I]], %[[I_VAR]] : i32, !llvm.ptr
208-
// CHECK: %[[I1:.*]] = llvm.load %[[I_VAR]] : !llvm.ptr -> i32
207+
// CHECK: ptr.store %[[I]], %[[I_VAR]] : i32, !llvm.ptr
208+
// CHECK: %[[I1:.*]] = ptr.load %[[I_VAR]] : !llvm.ptr -> i32
209209
// CHECK: %[[I1_EXT:.*]] = llvm.sext %[[I1]] : i32 to i64
210210
// CHECK: %[[I_CSTYLE:.*]] = llvm.sub %[[I1_EXT]], %[[ONE_1]] : i64
211211
// CHECK: %[[ARR_I_REF:.*]] = llvm.getelementptr %[[ARR_REF]][%[[I_CSTYLE]]] : (!llvm.ptr, i64) -> !llvm.ptr
212-
// CHECK: llvm.store %[[I1]], %[[ARR_I_REF]] : i32, !llvm.ptr
212+
// CHECK: ptr.store %[[I1]], %[[ARR_I_REF]] : i32, !llvm.ptr
213213
// CHECK: omp.yield
214214
// CHECK: }
215215
// CHECK: omp.terminator
@@ -386,24 +386,24 @@ func.func @_QPopenmp_target_data_region() {
386386
// CHECK: %[[VAL_16:.*]] = llvm.icmp "sgt" %[[VAL_14]], %[[VAL_15]] : i64
387387
// CHECK: llvm.cond_br %[[VAL_16]], ^bb2, ^bb3
388388
// CHECK: ^bb2:
389-
// CHECK: llvm.store %[[VAL_13]], %[[VAL_3]] : i32, !llvm.ptr
390-
// CHECK: %[[VAL_17:.*]] = llvm.load %[[VAL_3]] : !llvm.ptr -> i32
391-
// CHECK: %[[VAL_18:.*]] = llvm.load %[[VAL_3]] : !llvm.ptr -> i32
389+
// CHECK: ptr.store %[[VAL_13]], %[[VAL_3]] : i32, !llvm.ptr
390+
// CHECK: %[[VAL_17:.*]] = ptr.load %[[VAL_3]] : !llvm.ptr -> i32
391+
// CHECK: %[[VAL_18:.*]] = ptr.load %[[VAL_3]] : !llvm.ptr -> i32
392392
// CHECK: %[[VAL_19:.*]] = llvm.sext %[[VAL_18]] : i32 to i64
393393
// CHECK: %[[VAL_20:.*]] = llvm.mlir.constant(1 : i64) : i64
394394
// CHECK: %[[VAL_21:.*]] = llvm.sub %[[VAL_19]], %[[VAL_20]] : i64
395395
// CHECK: %[[VAL_22:.*]] = llvm.getelementptr %[[VAL_1]][0, %[[VAL_21]]] : (!llvm.ptr, i64) -> !llvm.ptr
396-
// CHECK: llvm.store %[[VAL_17]], %[[VAL_22]] : i32, !llvm.ptr
396+
// CHECK: ptr.store %[[VAL_17]], %[[VAL_22]] : i32, !llvm.ptr
397397
// CHECK: %[[VAL_23:.*]] = llvm.add %[[VAL_12]], %[[VAL_8]] : i64
398398
// CHECK: %[[VAL_24:.*]] = llvm.trunc %[[VAL_8]] : i64 to i32
399-
// CHECK: %[[VAL_25:.*]] = llvm.load %[[VAL_3]] : !llvm.ptr -> i32
399+
// CHECK: %[[VAL_25:.*]] = ptr.load %[[VAL_3]] : !llvm.ptr -> i32
400400
// CHECK: %[[VAL_26:.*]] = llvm.add %[[VAL_25]], %[[VAL_24]] : i32
401401
// CHECK: %[[VAL_27:.*]] = llvm.add %[[VAL_12]], %[[VAL_8]] : i64
402402
// CHECK: %[[VAL_28:.*]] = llvm.mlir.constant(1 : index) : i64
403403
// CHECK: %[[VAL_29:.*]] = llvm.sub %[[VAL_14]], %[[VAL_28]] : i64
404404
// CHECK: llvm.br ^bb1(%[[VAL_27]], %[[VAL_26]], %[[VAL_29]] : i64, i32, i64)
405405
// CHECK: ^bb3:
406-
// CHECK: llvm.store %[[VAL_13]], %[[VAL_3]] : i32, !llvm.ptr
406+
// CHECK: ptr.store %[[VAL_13]], %[[VAL_3]] : i32, !llvm.ptr
407407
// CHECK: omp.terminator
408408
// CHECK: }
409409
// CHECK: llvm.return
@@ -463,7 +463,7 @@ func.func @_QPomp_target() {
463463
// CHECK: %[[VAL_5:.*]] = llvm.mlir.constant(1 : i64) : i64
464464
// CHECK: %[[VAL_6:.*]] = llvm.mlir.constant(0 : i64) : i64
465465
// CHECK: %[[VAL_7:.*]] = llvm.getelementptr %[[ARG_0]][0, %[[VAL_6]]] : (!llvm.ptr, i64) -> !llvm.ptr
466-
// CHECK: llvm.store %[[VAL_3]], %[[VAL_7]] : i32, !llvm.ptr
466+
// CHECK: ptr.store %[[VAL_3]], %[[VAL_7]] : i32, !llvm.ptr
467467
// CHECK: omp.terminator
468468
// CHECK: }
469469
// CHECK: llvm.return
@@ -669,9 +669,9 @@ func.func @_QPsb() {
669669
// CHECK: %[[EXIT_COND:.*]] = llvm.icmp "sgt"
670670
// CHECK: llvm.cond_br %[[EXIT_COND]], ^[[BB_LOOP_BODY:.*]], ^[[BB_EXIT:.*]]
671671
// CHECK: ^[[BB_LOOP_BODY]]:
672-
// CHECK: %[[LI_VAL:.*]] = llvm.load %[[LI_REF]] : !llvm.ptr -> i32
672+
// CHECK: %[[LI_VAL:.*]] = ptr.load %[[LI_REF]] : !llvm.ptr -> i32
673673
// CHECK: %[[LI_INC:.*]] = llvm.add %[[LI_VAL]], %[[ONE]] : i32
674-
// CHECK: llvm.store %[[LI_INC]], %[[LI_REF]] : i32, !llvm.ptr
674+
// CHECK: ptr.store %[[LI_INC]], %[[LI_REF]] : i32, !llvm.ptr
675675
// CHECK: llvm.br ^[[BB_ENTRY]]({{.*}})
676676
// CHECK: ^[[BB_EXIT]]:
677677
// CHECK: omp.terminator
@@ -703,7 +703,7 @@ func.func @_QPsb() {
703703
// CHECK: omp.parallel {
704704
// CHECK: omp.wsloop reduction(@[[EQV_REDUCTION]] -> %[[RED_ACCUMULATOR]] : !llvm.ptr) for
705705
// CHECK: %[[ARRAY_ELEM_REF:.*]] = llvm.getelementptr %[[ARRAY_REF]][0, %{{.*}}] : (!llvm.ptr, i64) -> !llvm.ptr
706-
// CHECK: %[[ARRAY_ELEM:.*]] = llvm.load %[[ARRAY_ELEM_REF]] : !llvm.ptr -> i32
706+
// CHECK: %[[ARRAY_ELEM:.*]] = ptr.load %[[ARRAY_ELEM_REF]] : !llvm.ptr -> i32
707707
// CHECK: omp.reduction %[[ARRAY_ELEM]], %[[RED_ACCUMULATOR]] : i32, !llvm.ptr
708708
// CHECK: omp.yield
709709
// CHECK: omp.terminator
@@ -769,10 +769,10 @@ func.func @_QPs(%arg0: !fir.ref<!fir.complex<4>> {fir.bindc_name = "x"}) {
769769
//CHECK: omp.parallel {
770770
//CHECK: %[[CONST_1:.*]] = llvm.mlir.constant(1 : i32) : i32
771771
//CHECK: %[[ALLOCA_1:.*]] = llvm.alloca %[[CONST_1:.*]] x !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)> {alignment = 8 : i64} : (i32) -> !llvm.ptr
772-
//CHECK: %[[LOAD:.*]] = llvm.load %[[ALLOCA]] : !llvm.ptr -> !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
773-
//CHECK: llvm.store %[[LOAD]], %[[ALLOCA_1]] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>, !llvm.ptr
772+
//CHECK: %[[LOAD:.*]] = ptr.load %[[ALLOCA]] : !llvm.ptr -> !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>
773+
//CHECK: ptr.store %[[LOAD]], %[[ALLOCA_1]] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8)>, !llvm.ptr
774774
//CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ALLOCA_1]][0, 0] : (!llvm.ptr) -> !llvm.ptr
775-
//CHECK: %[[LOAD_2:.*]] = llvm.load %[[GEP]] : !llvm.ptr -> !llvm.ptr
775+
//CHECK: %[[LOAD_2:.*]] = ptr.load %[[GEP]] : !llvm.ptr -> !llvm.ptr
776776
//CHECK: omp.terminator
777777
//CHECK: }
778778

@@ -852,13 +852,13 @@ func.func @sub_() {
852852
omp.flush(%arg0, %arg1, %arg2 : !fir.ref<i32>, !fir.ref<i32>, !fir.ref<i32>)
853853
// CHECK: omp.flush
854854
omp.flush
855-
// CHECK: %[[A_VAL:.*]] = llvm.load %[[ARG_A]] : !llvm.ptr -> i32
855+
// CHECK: %[[A_VAL:.*]] = ptr.load %[[ARG_A]] : !llvm.ptr -> i32
856856
%0 = fir.load %arg0 : !fir.ref<i32>
857-
// CHECK: %[[B_VAL:.*]] = llvm.load %[[ARG_B]] : !llvm.ptr -> i32
857+
// CHECK: %[[B_VAL:.*]] = ptr.load %[[ARG_B]] : !llvm.ptr -> i32
858858
%1 = fir.load %arg1 : !fir.ref<i32>
859859
// CHECK: %[[C_VAL:.*]] = llvm.add %[[A_VAL]], %[[B_VAL]] : i32
860860
%2 = arith.addi %0, %1 : i32
861-
// CHECK: llvm.store %[[C_VAL]], %[[ARG_C]] : i32, !llvm.ptr
861+
// CHECK: ptr.store %[[C_VAL]], %[[ARG_C]] : i32, !llvm.ptr
862862
fir.store %2 to %arg2 : !fir.ref<i32>
863863
// CHECK: omp.terminator
864864
omp.terminator
@@ -880,13 +880,13 @@ func.func @omp_critical_() {
880880
%1 = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFomp_criticalEy"}
881881
// CHECK: omp.critical(@help)
882882
omp.critical(@help) {
883-
// CHECK: %[[X_VAL:.*]] = llvm.load %[[X_REF]] : !llvm.ptr -> i32
883+
// CHECK: %[[X_VAL:.*]] = ptr.load %[[X_REF]] : !llvm.ptr -> i32
884884
%2 = fir.load %0 : !fir.ref<i32>
885-
// CHECK: %[[Y_VAL:.*]] = llvm.load %[[Y_REF]] : !llvm.ptr -> i32
885+
// CHECK: %[[Y_VAL:.*]] = ptr.load %[[Y_REF]] : !llvm.ptr -> i32
886886
%3 = fir.load %1 : !fir.ref<i32>
887887
// CHECK: %[[RESULT:.*]] = llvm.add %[[X_VAL]], %[[Y_VAL]] : i32
888888
%4 = arith.addi %2, %3 : i32
889-
// CHECK: llvm.store %[[RESULT]], %[[X_REF]] : i32, !llvm.ptr
889+
// CHECK: ptr.store %[[RESULT]], %[[X_REF]] : i32, !llvm.ptr
890890
fir.store %4 to %0 : !fir.ref<i32>
891891
// CHECK: omp.terminator
892892
omp.terminator

0 commit comments

Comments
 (0)