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
34 lines
1.3 KiB
LLVM
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}
|