<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60395>60395</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[flang] Compiler emits incorrect arguments for CHARACTER type in llvm
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
MucTepDayH16
</td>
</tr>
</table>
<pre>
```
flang-new version 17.0.0 (https://github.com/llvm/llvm-project.git 3af9dfe464446da8e9acea45681df28b18583370)
Target: x86_64-unknown-linux-gnu
```
Given the following code `a.f`:
```fortran
SUBROUTINE AR(TRANSA,TRANSB,LDA)
CHARACTER TRANSA,TRANSB
INTEGER LDA
PRINT *, TRANSA, TRANSB, LDA
END
```
Building with `flang-new -c a.f -emit-llvm -S` produce this llvm ir:
```llvm
...
define void @ar_(ptr %0, ptr %1, ptr %2, i64 %3, i64 %4) {
%6 = insertvalue { ptr, i64 } undef, ptr %1, 0
%7 = insertvalue { ptr, i64 } %6, i64 %4, 1
%8 = insertvalue { ptr, i64 } undef, ptr %0, 0
%9 = insertvalue { ptr, i64 } %8, i64 %3, 1
%10 = extractvalue { ptr, i64 } %9, 0
%11 = extractvalue { ptr, i64 } %9, 1
%12 = extractvalue { ptr, i64 } %7, 0
%13 = extractvalue { ptr, i64 } %7, 1
%14 = call ptr @_FortranAioBeginExternalListOutput(i32 -1, ptr @_QQcl.2F726F6F742F6C617061636B2D72656C656173652F612E6600, i32 5)
%15 = call i1 @_FortranAioOutputAscii(ptr %14, ptr %10, i64 1)
%16 = call i1 @_FortranAioOutputAscii(ptr %14, ptr %12, i64 1)
%17 = load i32, ptr %2, align 4
%18 = call i1 @_FortranAioOutputInteger32(ptr %14, i32 %17)
%19 = call i32 @_FortranAioEndIoStatement(ptr %14)
ret void
}
...
```
Arguments `%3` and `%4` denote the lengths or CHARACTER arguments and are unused, but this is not what expected in case of single character in arguments in `a.f`. It is also depicted in `_FortranAioOutputAscii` call, where the value `i64 1` is passed as length. This leads to unsound function signatures in ffi. For example, it is expected for `dgemm_` subroutine from BLAS to receive `13 x ptr` as arguments, but flang generate function with `13 x ptr` and `2 x i64` for it, since in has two `CHARACTER` arguments.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVktz46oS_jV402UVQhKSF14ofsykam7mTuJZp7BoydwrgwtQ4vn3p0CJX_M4M-ekUgkC-uuvu-mHcE51GnFOijtSLCdi8Dtj5_8Zmg0eluLbx5RPtkZ-mxNO337pktC67YXuphpf4QWtU0ZDWiY0oUBYtfP-4EhWE7YmbN0pvxu2SWP2hK37_uX93_Rgzf-w8UmnPGSinckWc57nOZeiwploUOQFr1LZsmqbVkWVZSUlbDbq3wjboSdZDceKP_N8Ouj_a_Oqp73Sw3Ha6WG8d0N7_PtBvaAGv0NoTd-bV6U7aIxEIJyKpA23s_pGvjXWW6HHXYg_T1_vHj9_3dw_rKB-JKzaPNYPTzVhi7i4I2zxaVmfGMPiY_1YLzarR7i9eIF5_7BZfVg9QpC8YDwe_vfx_mEDhAXRMwic1P1YavWw_IUv7gbVy-CAV-V3wQHnyE4bEEkLU9wrPw0hg-kT4RQO1sihQfA75SDuK_u9w2Ko41aSJONCYqs0wotREkhOhX0mrDp4C4QVNPB_W6cXaxbWiudhnV2sc8JmQMqT8wgrOJBsCUo7tP5F9AOG84BzEiuXMGiJ7a0ueoFS_g5K0HZNZgHpGwhhRfVPmNBbJrPfZFLduii9AElpRMGjt6L5JczsVn-a_pHolVb2u6Lld1qzPxK90ppH0Ub0_ejUnD6vx7ytlbnDTunV0aPVov-knP88-MPgCatUxmB6fnQ5ff7ypekTti4ZX_N1mbM1X_C0pDzlGb9jy5Lxgi94wdMy4wVb85StOKcxggGsOGd95FWcean0htbIonaNUudsSPPLJ0rfDU9vcPm_w2U_wx1zoDdCBnNus1H0qtOQXwpUf0vkXnvs0Aa0azLBX1HnmUP4nF0ghhtXkCst782TFx73qP014skQiz6Wmre6VC5vqtEPy2FtuyFgulAKYz5xCkLLt888fErUxmPsHz3qzu8cGHtR3sUJIwgKizDowaEM1m4HP9ZN5UAbD6874QGPB2w8SlAaGuEQTAtO6a5HaHYipAHacHYGVvrcqxK49wFO9M6AxIN6hyL8Z--B0-jZQOh1h3a05S3VOB1fBKcB9CCcQwnCvZmawCZWfRTSgTcwaGcGLaEddOPDGBDGCeEHi5Fk26oE1sYCHsX-0GMMeGR7srk1NiiVHe73z0GrG7bWDD50itaaPdx9qp-CKosNqpfIMM3gGAtCCI47--Xdw7GHQYcarfB4Jvfe467kx-AyOIZUCDuBkfIByyndYLBjJxz4VxMunuIchd81JxM5z-Qsm4kJzlNeFmnKWF5OdvM0lWWBRZbPZuUsbahEmaEQFLeN4LRpJmrOKMtomlFGi5KVScMqwQtRtRxLmZWS5BT3QvVJaKmJsd1EOTfgnNNsVkx6scXexfmNsdC24yFhLIxzdh5Hre3QOZLTXjnvzihe-T4OftFdpFjCwuwPqkcLoeWHADbGWmz8xctrr566_3aI_gmYk8H28z-b_QhbR7aOsHW05q8AAAD__0AxBt4">