diff --git a/llvm/lib/Target/DirectX/CMakeLists.txt b/llvm/lib/Target/DirectX/CMakeLists.txt --- a/llvm/lib/Target/DirectX/CMakeLists.txt +++ b/llvm/lib/Target/DirectX/CMakeLists.txt @@ -24,7 +24,9 @@ PointerTypeAnalysis.cpp LINK_COMPONENTS + AsmPrinter Core + SelectionDAG Support DirectXInfo DXILBitWriter diff --git a/llvm/lib/Target/DirectX/DXILPrepare.cpp b/llvm/lib/Target/DirectX/DXILPrepare.cpp --- a/llvm/lib/Target/DirectX/DXILPrepare.cpp +++ b/llvm/lib/Target/DirectX/DXILPrepare.cpp @@ -160,6 +160,13 @@ GEP->setOperand(0, NoOpBitcast); continue; } + if (auto *CB = dyn_cast(&I)) { + CB->removeFnAttrs(AttrMask); + CB->removeRetAttrs(AttrMask); + for (size_t Idx = 0, End = CB->arg_size(); Idx < End; ++Idx) + CB->removeParamAttrs(Idx, AttrMask); + continue; + } } } } diff --git a/llvm/test/CodeGen/DirectX/strip-call-attrs.ll b/llvm/test/CodeGen/DirectX/strip-call-attrs.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/strip-call-attrs.ll @@ -0,0 +1,25 @@ + +; RUN: opt -S -dxil-prepare < %s | FileCheck %s +target triple = "dxil-unknown-unknown" + +@f = internal unnamed_addr global float 0.000000e+00, align 4 +@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_static_global.hlsl, ptr null }] + +; Make sure noundef is removed for function. +; CHECK:declare float @"?init@@YAMXZ"() +declare noundef float @"?init@@YAMXZ"() local_unnamed_addr #0 + +; Make sure noundef is removed for call. +; CHECK: %call.i = tail call float @"?init@@YAMXZ"() +; Function Attrs: nounwind +define internal void @_GLOBAL__sub_I_static_global.hlsl() #1 { +entry: + %call.i = tail call noundef float @"?init@@YAMXZ"() #2 + store float %call.i, ptr @f, align 4 + ret void +} + +attributes #0 = { "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } +attributes #1 = { nounwind "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" } +attributes #2 = { nounwind } +