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

    <tr>
        <th>Summary</th>
        <td>
            Clang 21: unreachable produced when compiling OpenCL C for NVPTX target
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    When compiling this simple OpenCL kernel:

```
kernel 
void test_kernel(constant char* input) {
    if (input[0] == 'X') printf("match");
}
```

Clang 20 with NVPTX target (`clang-20 -xcl -fno-jump-tables -Xclang -triple=nvptx64 -Xclang -target-cpu -Xclang sm_50 -emit-llvm`) produces the expected code:

```
; Function Attrs: convergent noinline norecurse nounwind uwtable
define dso_local ptx_kernel void @test_kernel(ptr addrspace(4) nocapture noundef readonly align 1 %0) local_unnamed_addr #0 !kernel_arg_addr_space !7 !kernel_arg_access_qual !8 !kernel_arg_type !9 !kernel_arg_base_type !9 !kernel_arg_type_qual !10 {
 %2 = load i8, ptr addrspace(4) %0, align 1, !tbaa !11
  %3 = icmp eq i8 %2, 88
  br i1 %3, label %4, label %6

4: ; preds = %1
  %5 = tail call i32 (ptr addrspace(4), ...) @printf(ptr addrspace(4) noundef @.str) #2
  br label %6

6: ; preds = %4, %1
  ret void
}
```

Clang 21 with SPIR64 target (`clang-21 -xcl -fno-jump-tables --target=spir64-unknown-unknown -emit-llvm`) also works:

```
; Function Attrs: convergent nofree norecurse nounwind
define dso_local spir_kernel void @test_kernel(ptr addrspace(2) noundef readonly align 1 captures(none) %0) local_unnamed_addr #0 !kernel_arg_addr_space !4 !kernel_arg_access_qual !5 !kernel_arg_type !6 !kernel_arg_base_type !6 !kernel_arg_type_qual !7 {
 %2 = load i8, ptr addrspace(2) %0, align 1, !tbaa !8
  %3 = icmp eq i8 %2, 88
  br i1 %3, label %4, label %6

4: ; preds = %1
  %5 = tail call spir_func i32 (ptr addrspace(2), ...) @printf(ptr addrspace(2) noundef @.str) #3
  br label %6

6: ; preds = %1, %4
  ret void
}

; Function Attrs: alwaysinline convergent nofree norecurse nounwind
define dso_local spir_func void @__clang_ocl_kern_imp_test_kernel(ptr addrspace(2) noundef readonly align 1 captures(none) %0) local_unnamed_addr #1 !kernel_arg_addr_space !4 !kernel_arg_access_qual !5 !kernel_arg_type !6 !kernel_arg_base_type !6 !kernel_arg_type_qual !7 {
  %2 = load i8, ptr addrspace(2) %0, align 1, !tbaa !8
  %3 = icmp eq i8 %2, 88
  br i1 %3, label %4, label %6

4:                                                ; preds = %1
  %5 = tail call spir_func i32 (ptr addrspace(2), ...) @printf(ptr addrspace(2) noundef @.str) #3
  br label %6

6: ; preds = %4, %1
  ret void
}
```

However, Clang-21 with NVPTX target (`clang-21 -xcl -fno-jump-tables -Xclang -triple=nvptx64 -Xclang -target-cpu -Xclang sm_50 -emit-llvm`) produces a kernel with a single `unreachable` instruction:

```
; Function Attrs: mustprogress nofree noinline norecurse noreturn nosync nounwind willreturn memory(none) uwtable
define dso_local ptx_kernel void @test_kernel(ptr addrspace(4) noundef readnone align 1 captures(none) %0) local_unnamed_addr #0 !kernel_arg_addr_space !7 !kernel_arg_access_qual !8 !kernel_arg_type !9 !kernel_arg_base_type !9 !kernel_arg_type_qual !10 {
  unreachable
}

; Function Attrs: convergent noinline norecurse nounwind uwtable
define dso_local ptx_kernel void @__clang_ocl_kern_imp_test_kernel(ptr addrspace(4) noundef readonly align 1 captures(none) %0) local_unnamed_addr #1 !kernel_arg_addr_space !7 !kernel_arg_access_qual !8 !kernel_arg_type !9 !kernel_arg_base_type !9 !kernel_arg_type_qual !10 {
  %2 = load i8, ptr addrspace(4) %0, align 1, !tbaa !11
  %3 = icmp eq i8 %2, 88
  br i1 %3, label %4, label %6

4: ; preds = %1
  %5 = tail call i32 (ptr addrspace(4), ...) @printf(ptr addrspace(4) noundef @.str) #3
  br label %6

6:                                                ; preds = %4, %1
  ret void
}
```

Tested with apt.llvm.org Clang version: `21.1.0 (++20250811123159+6f5c887e557f-1~exp1~20250811123320.21)`
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsmFtv27gSgH8N_TKQQY2ufvCDEyM4Bzg4W-wWu30zKIqy2VKkSlJxsg_97QtSdm6Nm7pFtl1gAwN2OBQ5t2-GFHNObrUQS1JckGI9Y6PfGbvsLNN_zhrT3i7_2AkN3PSDVFJvwe-kAyf7QQn4ZRD68n_wQVgtFMlWhMZPSQ8fuppEQOjq2sgWvHB-c5iONTfaeaY98B2zBFcg9TB6ggsg1QWhKwAA2QHBehIUF5QUayDZmmRrIFi9I1iF6YOV2ncEa4LYM893BJHggmRhFVKtnyhF6OpSMb0FpLCXfgf___3N23fgmd0KH7YjJeVhQoIUkhuuIOm0Sd6P_ZB41ijhIHkXJ0DirRyUINlaXw_-pswfSOJyCR_GuzHXbwoKieilT5S67oM6UX3Tjlw48DsB4mYQ3IsWuGnFsz4l2QVcjZp7aTSsvLeOZCvgRl8LuxXagzZSK6kFaGMFH60Lv0a9l7qFcR8tIHTVii7MaZ3ZKMOZgsHfHGIDMVgkp4_jNXgLrG2tGxgXBOs8KK8NZ4Mf7bRHKzqwgrVGq1tgSm41pECwiHbGbTaj1qwX7SasBAQzCgTTaY8Ns9s4volbBEH1VMq5cG7zcWQqSOonYn87xMcWT8Yb5sRJYRi_WzGlx-wjWGBINlCGtSBrgpfwrAsm-y6P9oafBFPfMBYXTGMqEyyyuJrk_QDiI8g67hBm13Wc0liQ0VtZGFSsCeRgkT_6r5wSIg8xD5kwWNE6mIAo7rYq4ohnUgFnSoHMEE5EMKw-n8-jITm9Q-lEsKcQk5zOnbeT8RketX-qZPmskvnkoIOyVviYbi-Qmk6k_vbmv7-W-bOopqdQPZBIsrUbpC3zZNQftNnr4_fnQDLlDOyN_eC-FcDOiufwew67oNR53OHDUHxG2wFHR7DWRov7BP02APMvA1icALD8EoBPhY8ArM7hD1_mr_4J8Isx7kbNT4GIXw8ingYxOw_Eg6eK_ASIpzKdqT27dYce811pH11yTPrNJpK8MVzF3N_Iftj8rSSkPykJPz8KZ_7908k5r4X9x-zFtbDhmctjr3rh3Hmymb3KuZMdjvCTVgyc1FslgJR01FYwvotHxpKC1M7bMZaDMzpjPzo_WLO1wrn7IvHMGdUKP1oN2rhbze_PrHup1EHUi97Y2wdAv8J59r6ahE1eq6_-wIMtPIzqi9X-VS4W31DrP4vOa9b6Hxmdf-8dX3nv-HLR_t6WdF6NfytcuLRPBXTw81Bm58Zup4oP18K6qWiGqorpPJ3TWPHxguAFUixonaYpZmmxIHhRdgWv60oURdUl6SdxM6SfHkzKkM4xDT4s6axdZu0iW7CZWKZVUVR1mdFstltWGWZNXS7KrqgK2iwoYlOnTdUWnaiaJp3J5bQkpmmOBcU55y3rqpKlKWu6AgXJqeiZVHfGzKRzo1imRV5VOIted_HFEWLEmSCSYj2zy_BA0oxbR3KqpPPufgkvvRLL460uOORBNTq2pBb2j986Hd40XUJn7KO2ORutWu68H-JVDa8IXm2l343NnJue4FVsd9NXMljzXnBP8Cra4QheHUy5XuJfAQAA__8AJcsw">