<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/80982>80982</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [OMPT] Ident wrong ident flags with distributed parallel for
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          mikaoP
      </td>
    </tr>
</table>

<pre>
    ```c
// t1.c
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
        #pragma omp teams
        {
                #pragma omp distribute parallel for
                for (volatile int i = 0; i < 100; i++);
 }
}
```

```c
// tool.c
#include <omp-tools.h>
#include <stdio.h>
#include <stdlib.h>
static ompt_set_callback_t ompt_set_callback;

#define register_ompt_callback_t(name, type) \
  do { \
    type f_##name = &on_##name; \
    if (ompt_set_callback(name, (ompt_callback_t)f_##name) == ompt_set_never) \
      printf("0: Could not register callback '" #name "'\n"); \
  } while (0)

#define register_ompt_callback(name) register_ompt_callback_t(name, name##_t)
static void
on_ompt_callback_work(
  ompt_work_t wstype,
 ompt_scope_endpoint_t endpoint,
  ompt_data_t *parallel_data,
 ompt_data_t *task_data,
  uint64_t count,
  const void *codeptr_ra)
{
  switch(endpoint)
  {
    case ompt_scope_begin:
      printf("begin ");
      switch(wstype)
 {
        case ompt_work_loop:
 printf("ompt_work_loop\n");
          break;
        case ompt_work_loop_static:
          printf("ompt_work_loop_static\n");
 break;
        case ompt_work_loop_dynamic:
 printf("ompt_work_loop_dynamic\n");
          break;
        case ompt_work_loop_guided:
          printf("ompt_work_loop_guided\n");
 break;
        case ompt_work_loop_other:
 printf("ompt_work_loop_other\n");
          break;
        case ompt_work_sections:
          printf("ompt_work_sections\n");
 break;
        case ompt_work_single_executor:
 printf("ompt_work_single_executor\n");
          break;
        case ompt_work_single_other:
 printf("ompt_work_single_other\n");
          break;
        case ompt_work_workshare:
          printf("ompt_work_workshare\n");
 break;
        case ompt_work_distribute:
 printf("ompt_work_distribute\n");
          break;
        case ompt_work_taskloop:
          printf("ompt_work_taskloop\n");
 break;
        case ompt_work_scope:
 printf("ompt_work_scope\n");
          break;
      }
 break;
    case ompt_scope_end:
      printf("end ");
 switch(wstype)
      {
        case ompt_work_loop:
 printf("ompt_work_loop\n");
          break;
        case ompt_work_loop_static:
          printf("ompt_work_loop_static\n");
 break;
        case ompt_work_loop_dynamic:
 printf("ompt_work_loop_dynamic\n");
          break;
        case ompt_work_loop_guided:
          printf("ompt_work_loop_guided\n");
 break;
        case ompt_work_loop_other:
 printf("ompt_work_loop_other\n");
          break;
        case ompt_work_sections:
          printf("ompt_work_sections\n");
 break;
        case ompt_work_single_executor:
 printf("ompt_work_single_executor\n");
          break;
        case ompt_work_single_other:
 printf("ompt_work_single_other\n");
          break;
        case ompt_work_workshare:
          printf("ompt_work_workshare\n");
 break;
        case ompt_work_distribute:
 printf("ompt_work_distribute\n");
          break;
        case ompt_work_taskloop:
          printf("ompt_work_taskloop\n");
 break;
        case ompt_work_scope:
 printf("ompt_work_scope\n");
          break;
      }
 break;
    case ompt_scope_beginend:
      printf("ompt_scope_beginend should never be passed to %s\n", __func__);
      exit(-1);
 }
}

void ompt_finalize(ompt_data_t *tool_data)
{
 printf("0: ompt_event_runtime_shutdown\n");
}

int ompt_initialize(
  ompt_function_lookup_t lookup,
  int initial_device_num,
  ompt_data_t *tool_data)
{
  ompt_set_callback = (ompt_set_callback_t) lookup("ompt_set_callback");

 register_ompt_callback(ompt_callback_work);
  printf("0: NULL_POINTER=%p\n", (void*)NULL);
  return 1; //success
}
ompt_start_tool_result_t *ompt_start_tool(
unsigned int omp_version,
const char *runtime_version
){
  static ompt_start_tool_result_t ompt_start_tool_result = {&ompt_initialize,&ompt_finalize, 0};
  return &ompt_start_tool_result;
}
```

Compile and run: `clang -fopenmp t1.c && clang -fopenmp tool.c -shared -fPIC -o libtool.so && OMP_NUM_THREADS=2 OMP_TOOL_LIBRARIES=$PWD/libtool.so ./a.out`

Gives the following output
```
begin ompt_work_distribute
begin ompt_work_loop
end ompt_work_distribute
begin ompt_work_loop
end ompt_work_distribute
end ompt_work_distribute
```
There is a mismatch between the `work_loop` and the `work_distribute` flag. The reason is that in clang's codegen it is not possible to determine which of the to worksharings are being built in the `emitForStaticFinish` function. Since `work_distribute` has preference in a combined pragma, all events show it.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWU9v4zoO_zTKhWjgyPl7yKFNprsFZqbFtA97NGSbjrWVJUOSkzf76ReSY8dx3D8zncsDWhStI5Iif6REmgwzhu8k4prMbshsO2KVzZVeF_yZqYdRrNKfazIP6t-EBFsSXBN6S-gt2Mm4XQi5TESVIpBwY2zK1Tgn4ZcXqILHHTKXFgrGJaHLveIpoauj2OKmfoDjD6FhqdmuYKCKEiyywvQY-hLDkik3VvO4sggl00wIFJApPSyaKQ3eMsEsFwjOWg4k3EJAwhv_uIFJUH8g9Mb_rkjYWEIW2wZO89B48_jxfLHnYqXEsJNVUV45qnnN0b8SBmOZ5YlzkI0M2ihhQsQseY7s5VoLr905xYxLBI07bizqyIuctiB0KVmBhG7A_iyR0BWQ2abxeKpc6Lor4NkgiwgNCQ2drPc5oXMlO4vO62diPHPRujT4pL8hd41bdRV548KtU9fuI3GPume1-yk1lzYjdEkoDUh4DRtViRSksq0roFEEhC4IpdDiodStzDbSP616WMhiC4fcHTlCl8HpVrzL4y3e1XtCUv93-L0zzs6Dv5J-QcneFgelnaLGYE90a5GFg6nD3KCpHZmoEiOUaam4tJGF5vHEVzOmzLLIAqHXzf30S73tTlyWmeceB1Rc2vk0spCo6kxDoqSxHpYTTVSKpdWRZkN5xxy4TXJClydLV6f4dJJNwgx2Qca445KE1y-dFU-HNu5dtlZn48NVm0l62e2k1HtdKFWeVHa19Xi6J66f9GKN7PlifUBTVJ-PHsY-zmGZAQPerzf9KVnRVfyKvob3zyDeVTzF9NcQH2U-hFjZHPW78NacH0ZrMLFcSfNuqK3A7-I0XO4ERvg3JpVVb4Lts38ccb3huzx9xvthze6PyZnGdzv7JPG73j69AL2FtcP5YaQuS5_nqDeAtgK_fapcLn4znJ7pV9G1b3MD1H4xQNlPGl1LUKYXheDFGnDU_VkIPgvBZyH4LASfheAfVQj8W__r1WCAG0xeN5WuB4UYoWTGYApWAaGz01XbQBRllUyi6NJ6_Ju7hu9q8tZswv_1zZG3JOOSCf4_bJrmTs-lVNOVXfRNF12xl8U9ShvpSlpeYGTyyqbqIAcc3rOGy-MEgktueWPOWcPoYLu845Lfc1VGFuqHTtvn5zb1BlGKe55gJKvi5c7zNXyXA5HjcOJy8OAb6taaU4TPZhPn6GsdL_b1Qz14N9wXzv_-19ev0cP93fenLz9IuCV0VnbOTDt1uyZ05VjPd9NoKy1h4ocTfiZlqiRBY3qhqlFZpm3kPafRVMLWruzR2uBV0k8eUzhGONqjNlzJNih1q57kTLttmpPTcB0HIatuv96dYQ0YM0yog7e4IXR-cc42zeLpJmwgcLAvfNRwXuw_cLCHRoAbVZRcIDCZgq6kCx2ZB4lgcgdXmSpRFqWfuTpNhM6hT_KzQrjyJSGFq-zhbgNXCgSPPcmoRvD-20P0_a9v0dO_f3y53j6ScEv92tP9_dfo693Nj-sfd18e_VmZPvxnS-htZ48xobdsrCrbM_9ffI8GbI6QKSHUgcsdqMqWlR3EXE9ABgvMIN3nf09xKfHPy71O7Rn_lKNG4AYYFNwUzCY5xGgPiNJ7gMyDk_J54EPaXe9sPw8gE2w3hqccQSMzSrqNbc5cvqpjTOjCQKJS3KEEbh1dKgulMobHAl0lSNGiLrhEOOQ8yUFlXqFV0LwlcLkzwDRCjC40ccWF13C0Cwtub5V-9Dfolktucm_bMbOO4ZHL5CUEOTNQasxQo2PiEhgkqoi5u9315N3dGyYE-CpgXE07ALfjUboO01W4YiNcTxbBIgwWk3k4ytcsY4v5ktIJTjFJ5jGdLpJsOp8u4xmbz6arEV_TgE4DGiwmk9mKhuMV0gVjAbKU0ixMZ2QaYMG4GAuxL8ZK70bcmArXy2C1pCPBYhTGf-lBqcQDeKJLirPtSK-dzFVc7QyZBoIba067WG6F_7bk_tvDE5lt4S5FaeGgldwB988uogYO3OadLxvSs28bRpUW69za0r9c-8y64zav4nGiCnfjxL75d1Vq9V9MLKG33khD6K0H8f8AAAD__7FBxrw">