Skip to content

Support for conversion from !fir.ref<!fir.char<1,?>> to !fir.ref<!fir.char<1>> #15

@dk949

Description

@dk949

This is a conversion which flang generates when working with single characters.

This is a reduced example (based on code generated by flang) which causes this error:

fir.convert example
"builtin.module"() ({
  "func.func"() <{arg_attrs = [{fir.bindc_name = "transa"}, {fir.bindc_name = "transb"}, {fir.bindc_name = "m"}, {fir.bindc_name = "n"}, {fir.bindc_name = "k"}, {fir.bindc_name = "alpha"}, {fir.bindc_name = "a"}, {fir.bindc_name = "lda"}, {fir.bindc_name = "b"}, {fir.bindc_name = "ldb"}, {fir.bindc_name = "beta"}, {fir.bindc_name = "c"}, {fir.bindc_name = "ldc"}], function_type = (!fir.boxchar<1>, !fir.boxchar<1>, !fir.ref<i32>, !fir.ref<i32>, !fir.ref<i32>, !fir.ref<f32>, !fir.ref<!fir.array<?x?xf32>>, !fir.ref<i32>, !fir.ref<!fir.array<?x?xf32>>, !fir.ref<i32>, !fir.ref<f32>, !fir.ref<!fir.array<?x?xf32>>, !fir.ref<i32>) -> (), sym_name = "_QPsgemm"}> ({
  ^bb0(%arg0: !fir.boxchar<1>, %arg1: !fir.boxchar<1>, %arg2: !fir.ref<i32>, %arg3: !fir.ref<i32>, %arg4: !fir.ref<i32>, %arg5: !fir.ref<f32>, %arg6: !fir.ref<!fir.array<?x?xf32>>, %arg7: !fir.ref<i32>, %arg8: !fir.ref<!fir.array<?x?xf32>>, %arg9: !fir.ref<i32>, %arg10: !fir.ref<f32>, %arg11: !fir.ref<!fir.array<?x?xf32>>, %arg12: !fir.ref<i32>):

    %6 = "fir.dummy_scope"() : () -> !fir.dscope
    %35:2 = "fir.unboxchar"(%arg0) : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
    %36 = "fir.convert"(%35#0) : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1>>
    %37 = "arith.constant"() <{value = 1 : index}> : () -> index
    %38:2 = "hlfir.declare"(%36, %37, %6) <{operandSegmentSizes = array<i32: 1, 0, 1, 1>, uniq_name = "_QFsgemmEtransa"}> : (!fir.ref<!fir.char<1>>, index, !fir.dscope) -> (!fir.ref<!fir.char<1>>, !fir.ref<!fir.char<1>>)
    %72 = "fir.address_of"() <{symbol = @_QQclX4E}> : () -> !fir.ref<!fir.char<1>>
    %73 = "arith.constant"() <{value = 1 : index}> : () -> index
    %74:2 = "hlfir.declare"(%72, %73) <{fortran_attrs = #fir.var_attrs<parameter>, operandSegmentSizes = array<i32: 1, 0, 1, 0>, uniq_name = "_QQclX4E"}> : (!fir.ref<!fir.char<1>>, index) -> (!fir.ref<!fir.char<1>>, !fir.ref<!fir.char<1>>)
    %75 = "fir.emboxchar"(%38#1, %37) : (!fir.ref<!fir.char<1>>, index) -> !fir.boxchar<1>
    %76 = "hlfir.as_expr"(%74#0) : (!fir.ref<!fir.char<1>>) -> !hlfir.expr<!fir.char<1>>
    %77:3 = "hlfir.associate"(%76, %73) <{operandSegmentSizes = array<i32: 1, 0, 1>}> {adapt.valuebyref} : (!hlfir.expr<!fir.char<1>>, index) -> (!fir.ref<!fir.char<1>>, !fir.ref<!fir.char<1>>, i1)
    %78 = "fir.emboxchar"(%77#1, %73) : (!fir.ref<!fir.char<1>>, index) -> !fir.boxchar<1>
    %79 = "fir.call"(%75, %78) <{callee = @_QPlsame, fastmath = #arith.fastmath<contract>}> : (!fir.boxchar<1>, !fir.boxchar<1>) -> !fir.logical<4>
    "cf.br"()[^bb7] : () -> ()
  ^bb7:  // 4 preds: ^bb1, ^bb3, ^bb5, ^bb6
    "func.return"() : () -> ()

  }) : () -> ()

  "func.func"() <{function_type = (!fir.boxchar<1>, !fir.boxchar<1>) -> !fir.logical<4>, sym_name = "_QPlsame", sym_visibility = "private"}> ({
  }) : () -> ()

  "fir.global"() <{constant, linkName = "linkonce", sym_name = "_QQclX4E", symref = @_QQclX4E, type = !fir.char<1>}> ({
    %3 = "fir.string_lit"() {size = 1 : i64, value = "N"} : () -> !fir.char<1>
    "fir.has_value"(%3) : (!fir.char<1>) -> ()
  }) : () -> ()

}) {dlti.dl_spec = #dlti.dl_spec<i64 = dense<64> : vector<2xi64>, !llvm.ptr<272> = dense<64> : vector<4xi64>, !llvm.ptr<271> = dense<32> : vector<4xi64>, f80 = dense<128> : vector<2xi64>, i128 = dense<128> : vector<2xi64>, i16 = dense<16> : vector<2xi64>, i8 = dense<8> : vector<2xi64>, i1 = dense<8> : vector<2xi64>, !llvm.ptr = dense<64> : vector<4xi64>, f128 = dense<128> : vector<2xi64>, !llvm.ptr<270> = dense<32> : vector<4xi64>, f64 = dense<64> : vector<2xi64>, f16 = dense<16> : vector<2xi64>, i32 = dense<32> : vector<2xi64>, "dlti.stack_alignment" = 128 : i64, "dlti.endianness" = "little">, fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128", llvm.ident = "flang version 20.1.7 (git@github.com:llvm/llvm-project.git 6146a88f60492b520a36f8f8f3231e15f3cc6082)", llvm.target_triple = "x86_64-unknown-linux-gnu", omp.is_gpu = false, omp.is_target_device = false, omp.target_triples = [], omp.version = #omp.version<version = 11>} : () -> ()

Also attached original Fortran file, and MLIR produced from it: repro.zip

Flang command to compile the file:

flang -fc1 -emit-hlfir -mmlir -mlir-print-op-generic -o - -fopenmp -module-dir /tmp/tmp.ygWi7G7jB3 -ffixed-form -x f95-cpp-input sgemm_orig.f

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions