llvm-project/llvm/test/CodeGen/DirectX/metadata-stripping.ll
Finn Plummer 032900eb30
[DirectX] Add DXIL validation of llvm.loop metadata (#164292)
This pr adds the equivalent validation of `llvm.loop` metadata that is
[done in
DXC](8f21027f2a/lib/DxilValidation/DxilValidation.cpp (L3010)).

This is done as follows:
- Add `llvm.loop` to the metadata allow-list in `DXILTranslateMetadata`
- Iterate through all `llvm.loop` metadata nodes and strip all
incompatible ones
- Raise an error for ill-formed nodes that are compatible with DXIL

Resolves: https://github.com/llvm/llvm-project/issues/137387
2025-10-29 11:54:18 -07:00

34 lines
1.3 KiB
LLVM

; RUN: opt -S --dxil-translate-metadata %s | FileCheck %s
; Test that only metadata nodes that are valid in DXIL are allowed through
target triple = "dxilv1.0-unknown-shadermodel6.0-compute"
; Function Attrs: noinline nounwind memory(readwrite, inaccessiblemem: none)
define void @main(i32* %ptr) {
entry:
; metadata ID changes to 0 once the current !0 and !1 are removed
; since they aren't in the allowlist. range needs a payload.
; CHECK: %val = load i32, ptr %ptr, align 4, !range [[RANGEMD:![0-9]+]]
%val = load i32, ptr %ptr, align 4, !range !2
%cmp.i = icmp ult i32 1, 2
; Ensure that the !llvm.loop metadata node gets dropped.
; CHECK: br i1 %cmp.i, label %_Z4mainDv3_j.exit, label %_Z4mainDv3_j.exit, !llvm.loop [[LOOPMD:![0-9]+]]
br i1 %cmp.i, label %_Z4mainDv3_j.exit, label %_Z4mainDv3_j.exit, !llvm.loop !0
_Z4mainDv3_j.exit: ; preds = %for.body.i, %entry
ret void
}
; These next check lines check that only the range metadata remains
; No more metadata should be necessary, the rest (the current 0 and 1)
; should be removed.
; CHECK-NOT: !{!"llvm.loop.mustprogress"}
; CHECK-DAG: [[RANGEMD]] = !{i32 1, i32 5}
; CHECK-DAG: [[LOOPMD]] = distinct !{[[LOOPMD]]}
; CHECK-NOT: !{!"llvm.loop.mustprogress"}
!0 = distinct !{!0, !1}
!1 = !{!"llvm.loop.mustprogress"}
!2 = !{i32 1, i32 5}