-
Notifications
You must be signed in to change notification settings - Fork 14.8k
[HLSL] Add support to lookup a ResourceBindingInfo from its use #126556
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
ab1e78d
e7d1042
09b6373
2039b3b
f3e3b3f
cd70254
d2f17eb
2ac7284
c17776b
48a0201
010c535
2385cef
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -772,8 +772,7 @@ void DXILBindingMap::print(raw_ostream &OS, DXILResourceTypeMap &DRTM, | |
|
||
SmallVector<dxil::ResourceBindingInfo> | ||
DXILBindingMap::findByUse(const Value *Key) const { | ||
const PHINode *Phi = dyn_cast<PHINode>(Key); | ||
if (Phi) { | ||
if (const PHINode *Phi = dyn_cast<PHINode>(Key)) { | ||
SmallVector<dxil::ResourceBindingInfo> Children; | ||
for (const Value *V : Phi->operands()) { | ||
Children.append(findByUse(V)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Without a set that tracks and skips already visited There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Uhhh maybe, but I dont think so? Can you formulate an example? I've been trying myself for a bit and everything I come up with violates SSA. Visited lists are only relevant when cycles are possible and in order to introduce a cycle we need a CallInstr to reference something not yet defined and that's not allowed right?
|
||
|
@@ -782,9 +781,8 @@ DXILBindingMap::findByUse(const Value *Key) const { | |
} | ||
|
||
const CallInst *CI = dyn_cast<CallInst>(Key); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How does it impact the recursion if we check for CallInst before PHINode? I kind of like my base cases to be first, but I know thats not always possible. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Happy to test it but it looks like Which means the base case would earily exit before the PHINode code had a chance to run. Could maybe tuck it inside the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yeah the trivial reorder causes the PHINodes case to fail |
||
if (!CI) { | ||
if (!CI) | ||
return {}; | ||
} | ||
|
||
const Type *UseType = CI->getType(); | ||
|
||
|
@@ -794,9 +792,8 @@ DXILBindingMap::findByUse(const Value *Key) const { | |
case Intrinsic::not_intrinsic: { | ||
SmallVector<dxil::ResourceBindingInfo> Children; | ||
for (const Value *V : CI->args()) { | ||
if (V->getType() != UseType) { | ||
if (V->getType() != UseType) | ||
continue; | ||
} | ||
|
||
Children.append(findByUse(V)); | ||
} | ||
|
@@ -806,8 +803,7 @@ DXILBindingMap::findByUse(const Value *Key) const { | |
// Found the create, return the binding | ||
case Intrinsic::dx_resource_handlefrombinding: | ||
const auto *It = find(CI); | ||
if (It == Infos.end()) | ||
return {}; | ||
assert(It != Infos.end() && "HandleFromBinding must be in resource map"); | ||
return {*It}; | ||
} | ||
|
||
|
Uh oh!
There was an error while loading. Please reload this page.