Skip to content

Commit 93d2a2c

Browse files
authored
[DirectX] Run DXILFinalizeLinkage earlier in the pipeline (#117950)
This moves DXILFinalizeLinkage before the DXIL op lowering passes so that it doesn't end up internalizing any of the `dx.op.*` functions. This also exposed a bug when the pass is run on a module with intrinsics in them - marking the intrinsics as internal will fail the validator. Fixes #117761
1 parent b36f1c8 commit 93d2a2c

File tree

5 files changed

+14
-4
lines changed

5 files changed

+14
-4
lines changed

llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ static bool finalizeLinkage(Module &M) {
2323

2424
// Collect non-entry and non-exported functions to set to internal linkage.
2525
for (Function &EF : M.functions()) {
26+
if (EF.isIntrinsic())
27+
continue;
2628
if (EF.hasFnAttribute("hlsl.shader") || EF.hasFnAttribute("hlsl.export"))
2729
continue;
2830
Funcs.insert(&EF);

llvm/lib/Target/DirectX/DirectXTargetMachine.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,14 @@ class DirectXPassConfig : public TargetPassConfig {
8989

9090
FunctionPass *createTargetRegisterAllocator(bool) override { return nullptr; }
9191
void addCodeGenPrepare() override {
92+
addPass(createDXILFinalizeLinkageLegacyPass());
9293
addPass(createDXILIntrinsicExpansionLegacyPass());
9394
addPass(createDXILDataScalarizationLegacyPass());
9495
ScalarizerPassOptions DxilScalarOptions;
9596
DxilScalarOptions.ScalarizeLoadStore = true;
9697
addPass(createDXILFlattenArraysLegacyPass());
9798
addPass(createScalarizerPass(DxilScalarOptions));
9899
addPass(createDXILOpLoweringLegacyPass());
99-
addPass(createDXILFinalizeLinkageLegacyPass());
100100
addPass(createDXILTranslateMetadataLegacyPass());
101101
addPass(createDXILPrepareModulePass());
102102
}

llvm/test/CodeGen/DirectX/BufferStore-errors.ll

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ target triple = "dxil-pc-shadermodel6.6-compute"
66
; CHECK: error:
77
; CHECK-SAME: in function storetoomany
88
; CHECK-SAME: typedBufferStore data must be a vector of 4 elements
9-
define void @storetoomany(<5 x float> %data, i32 %index) {
9+
define void @storetoomany(<5 x float> %data, i32 %index) "hlsl.export" {
1010
%buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
1111
@llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4f32_1_0_0(
1212
i32 0, i32 0, i32 1, i32 0, i1 false)
@@ -21,7 +21,7 @@ define void @storetoomany(<5 x float> %data, i32 %index) {
2121
; CHECK: error:
2222
; CHECK-SAME: in function storetoofew
2323
; CHECK-SAME: typedBufferStore data must be a vector of 4 elements
24-
define void @storetoofew(<3 x i32> %data, i32 %index) {
24+
define void @storetoofew(<3 x i32> %data, i32 %index) "hlsl.export" {
2525
%buffer = call target("dx.TypedBuffer", <4 x i32>, 1, 0, 0)
2626
@llvm.dx.handle.fromBinding.tdx.TypedBuffer_v4i32_1_0_0(
2727
i32 0, i32 0, i32 1, i32 0, i1 false)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
; RUN: opt -S -dxil-finalize-linkage -verify -mtriple=dxil-unknown-shadermodel6.5-library %s
2+
3+
define float @f(float %f) "hlsl.export" {
4+
%x = call float @llvm.atan.f32(float %f)
5+
ret float %x
6+
}
7+
8+
declare float @llvm.atan.f32(float)

llvm/test/CodeGen/DirectX/llc-pipeline.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
; CHECK-NEXT: Target Library Information
88
; CHECK-NEXT: Target Transform Information
99
; CHECK-NEXT: ModulePass Manager
10+
; CHECK-NEXT: DXIL Finalize Linkage
1011
; CHECK-NEXT: DXIL Intrinsic Expansion
1112
; CHECK-NEXT: DXIL Data Scalarization
1213
; CHECK-NEXT: DXIL Array Flattener
@@ -15,7 +16,6 @@
1516
; CHECK-NEXT: Scalarize vector operations
1617
; CHECK-NEXT: DXIL Resource analysis
1718
; CHECK-NEXT: DXIL Op Lowering
18-
; CHECK-NEXT: DXIL Finalize Linkage
1919
; CHECK-NEXT: DXIL resource Information
2020
; CHECK-NEXT: DXIL Shader Flag Analysis
2121
; CHECK-NEXT: DXIL Module Metadata analysis

0 commit comments

Comments
 (0)