Skip to content

Commit e400314

Browse files
authored
Fix dropping of DXIL metadata like nonuniform in mldst-motion (#4122) (#4126)
In mldst-motion, use llvm::combineMetadata which is modified to preserve dxil metadata, instead of Instruction::dropUnknownMetadata. Fixes #4120 (cherry picked from commit ccf845a)
1 parent 1b4903f commit e400314

2 files changed

Lines changed: 41 additions & 2 deletions

File tree

lib/Transforms/Scalar/MergedLoadStoreMotion.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
#include "llvm/Support/raw_ostream.h"
9191
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
9292
#include "llvm/Transforms/Utils/SSAUpdater.h"
93+
#include "llvm/Transforms/Utils/Local.h"
9394
#include <vector>
9495
using namespace llvm;
9596

@@ -293,7 +294,7 @@ void MergedLoadStoreMotion::hoistInstruction(BasicBlock *BB,
293294

294295
// Intersect optional metadata.
295296
HoistCand->intersectOptionalDataWith(ElseInst);
296-
HoistCand->dropUnknownMetadata();
297+
combineMetadata(HoistCand, ElseInst, None); // HLSL Change: Preserve DXIL metadata
297298

298299
// Prepend point for instruction insert
299300
Instruction *HoistPt = BB->getTerminator();
@@ -480,7 +481,7 @@ bool MergedLoadStoreMotion::sinkStore(BasicBlock *BB, StoreInst *S0,
480481
BasicBlock::iterator InsertPt = BB->getFirstInsertionPt();
481482
// Intersect optional metadata.
482483
S0->intersectOptionalDataWith(S1);
483-
S0->dropUnknownMetadata();
484+
combineMetadata(S0, S1, None); // HLSL Change: Preserve DXIL metadata
484485

485486
// Create the new store to be inserted at the join point.
486487
StoreInst *SNew = (StoreInst *)(S0->clone());
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// RUN: %dxc -T vs_6_0 %s | FileCheck %s
2+
3+
// Make sure we preserve non-uniform through mldst-motion
4+
5+
// CHECK-NOT: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 {{.*}}, i1 false)
6+
// CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 {{.*}}, i1 true)
7+
8+
StructuredBuffer<uint> g_ObjectIndices[] : register( t0, space2 );
9+
10+
uint getIndex16Bit( int iInstance, uint uIdx )
11+
{
12+
uint uIndexToAccess = uIdx;
13+
14+
if ( ( uIdx & 1 ) == 0 )
15+
{
16+
uint uReadIdx = g_ObjectIndices[ NonUniformResourceIndex( iInstance ) ][ NonUniformResourceIndex( uIndexToAccess ) ];
17+
return uReadIdx & 0xffff;
18+
}
19+
else
20+
{
21+
uint uReadIdx = g_ObjectIndices[ NonUniformResourceIndex( iInstance ) ][ NonUniformResourceIndex( uIndexToAccess ) ];
22+
uReadIdx = uReadIdx >> 16;
23+
return uReadIdx & 0xffff;
24+
}
25+
}
26+
27+
uint3 GetIndex16Bit( int instance, int primitiveIndex )
28+
{
29+
uint idx = 3 * primitiveIndex;
30+
uint uIdx0 = getIndex16Bit( instance, idx );
31+
uint uIdx1 = getIndex16Bit( instance, idx + 1 );
32+
uint uIdx2 = getIndex16Bit( instance, idx + 2 );
33+
return uint3( uIdx0, uIdx1, uIdx2 );
34+
}
35+
36+
uint3 main( int instance : INSTANCE, int primitiveIndex : PRIMINDEX ) : OUT {
37+
return GetIndex16Bit(instance, primitiveIndex);
38+
}

0 commit comments

Comments
 (0)