<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/90869>90869</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[mlir][openmp] - LLVM IR codegen for `omp.task` in MLIR does not honor dependencies on a task in the presence of the `if` clause
</td>
</tr>
<tr>
<th>Labels</th>
<td>
openmp,
mlir,
llvm:openmpirbuilder
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
bhandarkar-pranav
</td>
</tr>
</table>
<pre>
In the following piece of MLIR code, the if condition in the `if` clause on the `omp.task` operation is a compile time constant. Therefore, the else path willl be taken. If the `if` clause in an OpenMP task evaluates to false, then per the OpenMP spec an undeferred task is generated. This undeferred task should still honor all dependencies specified by the `depend` clause (if present).
```
module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<!llvm.ptr<270>, dense<32> : vector<4xi64>>, #dlti.dl_entry<i64, dense<64> : vector<2xi64>>, #dlti.dl_entry<i32, dense<32> : vector<2xi64>>, #dlti.dl_entry<!llvm.ptr<27\
2>, dense<64> : vector<4xi64>>, #dlti.dl_entry<!llvm.ptr<271>, dense<32> : vector<4xi64>>, #dlti.dl_entry<f16, dense<16> : vector<2xi64>>, #dlti.dl_entry<f64, dense<64> : vector<2xi64>>, #dlti.dl_entry<f128, dense<128> : vector<2x\
i64>>, #dlti.dl_entry<f80, dense<128> : vector<2xi64>>, #dlti.dl_entry<i128, dense<128> : vector<2xi64>>, #dlti.dl_entry<i16, dense<16> : vector<2xi64>>, #dlti.dl_entry<i8, dense<8> : vector<2xi64>>, #dlti.dl_entry<i1, dense<8> : \
vector<2xi64>>, #dlti.dl_entry<!llvm.ptr, dense<64> : vector<4xi64>>, #dlti.dl_entry<"dlti.endianness", "little">, #dlti.dl_entry<"dlti.stack_alignment", 128 : i64>>, fir.defaultkind = "a1c4d8i4l4r4", fir.kindmap = "", llvm.data_l\
ayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128", llvm.target_triple = "x86_64-unknown-linux-gnu", omp.is_gpu = false, omp.is_target_device = false, omp.version = #omp.version<version = 11>\
} {
llvm.func @foo_(%arg0: !llvm.ptr {fir.bindc_name = "n"}, %arg1: !llvm.ptr {fir.bindc_name = "r"}) attributes {fir.internal_name = "_QPfoo"} {
%0 = llvm.mlir.constant(false) : i1
omp.task if(%0) depend(taskdependin -> %arg0 : !llvm.ptr) {
%1 = llvm.load %arg0 : !llvm.ptr -> i32
llvm.store %1, %arg1 : i32, !llvm.ptr
omp.terminator
}
llvm.return
}
llvm.func @llvm.stacksave.p0() -> !llvm.ptr attributes {sym_visibility = "private"}
llvm.func @llvm.stackrestore.p0(!llvm.ptr) attributes {sym_visibility = "private"}
}
```
However, when the LLVM IR is generated, I see this
```
%8 = call ptr @__kmpc_omp_task_alloc(ptr @1, i32 %omp_global_thread_num, i32 1, i64 40, i64 16, ptr @foo_..omp_par)
%9 = load ptr, ptr %8, align 8
call void @llvm.memcpy.p0.p0.i64(ptr align 1 %9, ptr align 1 %structArg, i64 16, i1 false)
br i1 false, label %10, label %12
10: ; preds = %codeRepl
%11 = call i32 @__kmpc_omp_task_with_deps(ptr @1, i32 %omp_global_thread_num, ptr %8, i32 1, ptr %.dep.arr.addr, i32 0, ptr null)
br label %13
12: ; preds = %codeRepl
call void @__kmpc_omp_task_begin_if0(ptr @1, i32 %omp_global_thread_num, ptr %8)
call void @foo_..omp_par(i32 %omp_global_thread_num, ptr %8)
call void @__kmpc_omp_task_complete_if0(ptr @1, i32 %omp_global_thread_num, ptr %8)
br label %13
```
In the else case (Basic block `12`), there is **no call made to the OpenMP runtime to make the task wait until dependencies are resolved.**
To reproduce this, save the above code in test.mlir and then use the following command
```
mlir-translate -mlir-to-llvmir test.mlir -o test.ll
```
Here is the equivalent code generated by clang, which IMO is correct (Showing only the else codegen)
```
call void @__kmpc_omp_taskwait_deps_51(ptr @1, i32 %0, i32 1, ptr %8, i32 0, ptr null, i32 0)
call void @__kmpc_omp_task_begin_if0(ptr @1, i32 %0, ptr %1)
%14 = call i32 @.omp_task_entry.(i32 %0, ptr %1) #3
call void @__kmpc_omp_task_complete_if0(ptr @1, i32 %0, ptr %1)
%15 = load i32, ptr %a, align 4
ret i32 %15
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysWF-P4ygS_zTkBcWy8Z84D3nIdO_oWprR7s2u7tXCppxwweADnJ7-9ifATuxMpjM7O1LUbaDqx6-KoqCgxvCDBNih_APKn1d0sEeld_WRSkb1iep1r6mk51Wt2NvuRWJ7BNwqIdQrlwfcc2gAqxZ__vTyBTeKASJPXoa3uFGSccuVxDzooSLmLSpi3Ag6GMDq0q26PrLUnNyg6kHToGYwxY3qei4AW96BgzSWShvhv46goVX6MiEIA7in9ohfuRAC14AtPYGM8Et7d3YuMZX49x7k5z-wmxzDmYqBWjDYKtxSYSZwiXvQHmQUNz00TnuQDFrQGlhA4AYfQDr-wBxHbr4RMUc1CIaN5ULgo5JKYyoEZtCDZCAbDsbD85YDw_XbxD0IzPgjUvIW9xoMSIvINsIofkbxfvxbxOPPNzvFBgGYWqt5PTgT0eYDE5ZHTFTeGpQ-Y0TSeR9Kn2Y9IK1-812JEOcu6q1G6RPZxCj9zfmJgTSA0qeUoPQ3jNI9PkNjlRPKvvIic2JB8g6oG59heOklBnmMkZIHPB5j3BqH8qfgQHJj5R2Gj628RU9-hevapJhjJMVPmN3-Ave3CSkXREh5B-Xi0IdwZfwY7WFI_BCnxyj_3MN8wePnWNxFuDj0J6P8n8c08V0gGadSgjGIkCBLBLdWgGs_VDeWNqeKCn6Qnc9nHiMhpeezINFyHTFo6SDsiUs2Zi5CkyZjJc9EprNR3Uk6kY72k9Q44s1n1NJKXBxI39RgJzlYdyjdw7r3CW7vduY-Ja6ZLJvuy7HbF9maXz58oO0TUq5dHIcv6buKSb3I1n_68LwSslQfwFZW817AxORrWVRFth7kSapXuRZcDl_XBzmMiu7o5KY69INXuBxbY_8IyeDMG_hW4gzauKN2zP6zLpQ-zQcTn6smV6HNsztAQgMH8u0gG4yyuFWqQs6unOpD7EP0Gm5Oy61KzSVrKkm7i5nS2bN5DmHiVJMfVtWT6vbmgHPiXFrQkoqFRvXvP1qlgtrcEOzmjr2Un7YTXEfTpQORcvTdNgRlclWbLjCYt8H22EmNZzYp3VBocInXfpcF9-AbIz32nI9nlFwZCUXZ95QDsjsGZ-p-0FilwSPN_BuMSMfNeqUQlL1FoDsuqUsFVwdtnq8Nr6PBDlpOnbPxRViMPGhzMvQMUR97P20nb1yNWC6heeuqMze85oLbt2n9es3P1MK47u9Pp8FbP824cPVPznX9WN6y_qVe4Qw-p766W6O7un369J_P-OXL4mroBF6wAcD2yM0717aLU0leej6Nuyv6zZDFVXXq-qZSXV-5-KqoEKpBpByH_VLzlDhlJ3MQqqaiskcNlFVy6KbxIFhkOIunr3DgjUBuQ0eRg-ip89qM1DYEpovJ8SzxOiT3p53P5ric5D33s-Lssj4ddE3_FvWx-_kroCcf9BI_wYQ56zNWD43d68OSLU-m1HZhWOtZ7xMWtAbhd0G8bJK5t5OQs9IP7m7NzBgGuStuvkAvZtYnyXVNvKO_XZNXbo8Vg978zXWZu_GyRmNnxKCPqNYRZUxPAvEkIAchli642pku7CQ_ZOdi1W7Nq-HAZcXb-KfNm4guprmJuPLvw71P29WUAiz8Eubf9_DdzTzW0L5cbWio4z5QwxtcC9WcXKmXEKdDtmP1qcElD0T2iOylCpZ1lIGrUmc1qR6kr5Gtwh09gR_yR9Ir5Ra7wZsqk2rAGowSZ2BRgJ8T_UthDb1WbGjGPEWesMvdHpnW6gy-4vfVPRjrD0tMJQsVsytRl48Fjeo6N3y_QBVcr62m0ghqAa9DW61dnuB6NsFahYYQ7zh5TMej67y__zfwMxUgbSB9ycWuxG4ElYeQtXlzxC-ff3dqjdIaGusW6M9jMEFJ8TZbPsXgAPISCveT93uR6JbGp4fKncz3AjG-lwHK7-z6S-ePbYMHuzeezZgs836SfZP5ogusv9pH1217i-Mumukv2qfvccyvh9N4yxkF6fVwyiYFDXbCTPKb5VyxXcq26ZauYJdskqwo8rIkq-Mu32SbepO0RVNvaZkladxkmyKjUEKabupsxXckJlmcxyQp4iyLoyImJE9z2uSENiyvURZDR7mI_Hmo9GHFjRlgt43LYrvyecX4tzlCVA-y68OtHxHiNsOl4bRRug8iXNcDFwz8cP680js3vK6Hg3EHLzfWXKez3Ar_-ufx8meUfxgnyp_x-nJ7GUMdt0rfvtdxGV7_mAKDpbLjo9Yi1SiJ6fhCFtJfeLYKb4d3HudWgxa7o7W9QekekY-IfDxwexzqqFEdIh-9veHfutfqv9BYRD561xlEPnrv_T8AAP__HxUvUQ">