Issue 165750
Summary [DirectX] Unsupported intrinsic `llvm.fshl.i64` for DXIL lowering
Labels backend:DirectX
Assignees
Reporter Icohedron
    https://godbolt.org/z/f6r7ThrcG

For the following shader, Clang emits the `llvm.fshl.i64` intrinsic which is not supported for DXIL lowering.
```hlsl
struct Pair {
    int32_t a;
 int32_t b;
};
RWStructuredBuffer<Pair> src;
RWStructuredBuffer<Pair> dest;
Pair Swap(Pair p) {
    Pair result;
    result.a = p.b;
 result.b = p.a;
    return result;
}
[numthreads(1, 1, 1)]
void CSMain(uint3 Tid : SV_GroupThreadID) {
    dest[Tid.x] = Swap(src[Tid.x]);
}
```

```llvm
define void @CSMain() local_unnamed_addr #1 {
entry:
  %0 = tail call target("dx.RawBuffer", %struct.Pair, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_s_struct.Pairs_1_0t(i32 0, i32 0, i32 1, i32 0, ptr nonnull @.str)
  %1 = tail call target("dx.RawBuffer", %struct.Pair, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_s_struct.Pairs_1_0t(i32 2, i32 0, i32 1, i32 0, ptr nonnull @.str.2)
  %2 = tail call i32 @llvm.dx.thread.id.in.group(i32 0)
  %3 = tail call noundef nonnull align 1 dereferenceable(8) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_s_struct.Pairs_1_0t(target("dx.RawBuffer", %struct.Pair, 1, 0) %0, i32 %2)
  %4 = load i64, ptr %3, align 1
  %5 = tail call noundef nonnull align 1 dereferenceable(8) ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_s_struct.Pairs_1_0t(target("dx.RawBuffer", %struct.Pair, 1, 0) %1, i32 %2)
  %ref.tmp.i.sroa.0.0.insert.insert = tail call i64 @llvm.fshl.i64(i64 %4, i64 %4, i64 32)
  store i64 %ref.tmp.i.sroa.0.0.insert.insert, ptr %5, align 1
  ret void
}
```

_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to