[llvm] [HLSL][DirectX] Avoid visited values when searching in `hasNonUniformIndex` (PR #189498)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 9 13:08:11 PDT 2026
https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/189498
>From 717dc6cf2420206cbddeb20af36ae2616d2e5a08 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 30 Mar 2026 15:08:19 -0700
Subject: [PATCH 1/9] fix search to avoid alredy viset values
---
llvm/lib/Target/DirectX/DXILOpLowering.cpp | 5 ++++
.../CodeGen/DirectX/is_nonuniform_loop.ll | 27 +++++++++++++++++++
2 files changed, 32 insertions(+)
create mode 100644 llvm/test/CodeGen/DirectX/is_nonuniform_loop.ll
diff --git a/llvm/lib/Target/DirectX/DXILOpLowering.cpp b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
index 794bae8fd3a34..995e5311b5a66 100644
--- a/llvm/lib/Target/DirectX/DXILOpLowering.cpp
+++ b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
@@ -252,10 +252,15 @@ class OpLowerer {
return false;
SmallVector<Value *> WorkList;
+ SmallPtrSet<Value *, 8> Visited;
+
WorkList.push_back(IndexOp);
while (!WorkList.empty()) {
Value *V = WorkList.pop_back_val();
+ if (!Visited.insert(V).second)
+ continue;
+
if (auto *CI = dyn_cast<CallInst>(V)) {
if (CI->getCalledFunction()->getIntrinsicID() ==
Intrinsic::dx_resource_nonuniformindex)
diff --git a/llvm/test/CodeGen/DirectX/is_nonuniform_loop.ll b/llvm/test/CodeGen/DirectX/is_nonuniform_loop.ll
new file mode 100644
index 0000000000000..496a0111edd65
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/is_nonuniform_loop.ll
@@ -0,0 +1,27 @@
+; RUN: opt -S -dxil-intrinsic-expansion -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s
+
+; The goal of this test it to make sure compilation successfully,
+; in bad case it should timeout.
+
+ at Out.str = private unnamed_addr constant [4 x i8] c"Out\00", align 1
+
+; Function Attrs: nofree noinline norecurse nosync nounwind memory(inaccessiblemem: readwrite)
+define void @main() local_unnamed_addr #0 {
+entry:
+ %cmp.i4.not = icmp eq i32 4, 0
+ br i1 %cmp.i4.not, label %_Z4mainj.exit, label %for.body.i
+
+for.body.i: ; preds = %entry, %for.body.i
+ %i.0.i5 = phi i32 [ %inc.i, %for.body.i ], [ 0, %entry ]
+ %1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 4, i32 %i.0.i5, ptr nonnull @Out.str)
+ %2 = tail call noundef i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", i32, 1, 0) %1, i8 1)
+ %inc.i = add nuw nsw i32 %i.0.i5, 1
+ %exitcond.not = icmp eq i32 %inc.i, 4
+ br i1 %exitcond.not, label %_Z4mainj.exit, label %for.body.i
+
+_Z4mainj.exit: ; preds = %for.body.i, %entry
+ ret void
+}
+
+
+attributes #0 = { nofree noinline norecurse nosync nounwind memory(inaccessiblemem: readwrite) "frame-pointer"="all" "hlsl.numthreads"="4,1,1" "hlsl.shader"="compute" "no-signed-zeros-fp-math"="true" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
>From b97fd7559114f74d36572361833749e04cbf8993 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 30 Mar 2026 15:13:29 -0700
Subject: [PATCH 2/9] simplify test
---
llvm/test/CodeGen/DirectX/is_nonuniform_loop.ll | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/llvm/test/CodeGen/DirectX/is_nonuniform_loop.ll b/llvm/test/CodeGen/DirectX/is_nonuniform_loop.ll
index 496a0111edd65..7f0d843921bd5 100644
--- a/llvm/test/CodeGen/DirectX/is_nonuniform_loop.ll
+++ b/llvm/test/CodeGen/DirectX/is_nonuniform_loop.ll
@@ -6,7 +6,7 @@
@Out.str = private unnamed_addr constant [4 x i8] c"Out\00", align 1
; Function Attrs: nofree noinline norecurse nosync nounwind memory(inaccessiblemem: readwrite)
-define void @main() local_unnamed_addr #0 {
+define void @main() local_unnamed_addr {
entry:
%cmp.i4.not = icmp eq i32 4, 0
br i1 %cmp.i4.not, label %_Z4mainj.exit, label %for.body.i
@@ -22,6 +22,3 @@ for.body.i: ; preds = %entry, %for.body.i
_Z4mainj.exit: ; preds = %for.body.i, %entry
ret void
}
-
-
-attributes #0 = { nofree noinline norecurse nosync nounwind memory(inaccessiblemem: readwrite) "frame-pointer"="all" "hlsl.numthreads"="4,1,1" "hlsl.shader"="compute" "no-signed-zeros-fp-math"="true" "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
>From 6a382eae5f8e9f7823ba0446eb25fd9dcf098a6a Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 30 Mar 2026 15:19:38 -0700
Subject: [PATCH 3/9] rename test
---
.../{is_nonuniform_loop.ll => is_nonuniform_within_loop.ll} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename llvm/test/CodeGen/DirectX/{is_nonuniform_loop.ll => is_nonuniform_within_loop.ll} (100%)
diff --git a/llvm/test/CodeGen/DirectX/is_nonuniform_loop.ll b/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop.ll
similarity index 100%
rename from llvm/test/CodeGen/DirectX/is_nonuniform_loop.ll
rename to llvm/test/CodeGen/DirectX/is_nonuniform_within_loop.ll
>From 494493b6420b005611f235880875e65c6e93c0fa Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 30 Mar 2026 15:20:53 -0700
Subject: [PATCH 4/9] improve comment wording
---
llvm/test/CodeGen/DirectX/is_nonuniform_within_loop.ll | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop.ll b/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop.ll
index 7f0d843921bd5..30ff6e4309f82 100644
--- a/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop.ll
+++ b/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop.ll
@@ -1,11 +1,10 @@
; RUN: opt -S -dxil-intrinsic-expansion -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s
-; The goal of this test it to make sure compilation successfully,
+; The goal of this test it to make sure compilation finishes successfully,
; in bad case it should timeout.
@Out.str = private unnamed_addr constant [4 x i8] c"Out\00", align 1
-; Function Attrs: nofree noinline norecurse nosync nounwind memory(inaccessiblemem: readwrite)
define void @main() local_unnamed_addr {
entry:
%cmp.i4.not = icmp eq i32 4, 0
>From 07fd932815ca08d30c7d66be4848fdedd028a158 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 30 Mar 2026 15:53:43 -0700
Subject: [PATCH 5/9] add nuri version of the test
---
.../DirectX/is_nonuniform_within_loop.ll | 21 ++++++++-------
.../DirectX/is_nonuniform_within_loop_nuri.ll | 27 +++++++++++++++++++
2 files changed, 39 insertions(+), 9 deletions(-)
create mode 100644 llvm/test/CodeGen/DirectX/is_nonuniform_within_loop_nuri.ll
diff --git a/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop.ll b/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop.ll
index 30ff6e4309f82..c330182e62b23 100644
--- a/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop.ll
+++ b/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop.ll
@@ -1,22 +1,25 @@
-; RUN: opt -S -dxil-intrinsic-expansion -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s
+; RUN: opt -S -dxil-intrinsic-expansion -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
; The goal of this test it to make sure compilation finishes successfully,
; in bad case it should timeout.
+
@Out.str = private unnamed_addr constant [4 x i8] c"Out\00", align 1
+; CHECK-LABEL: define void @main
+; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 %phi, i1 false)
define void @main() local_unnamed_addr {
entry:
- %cmp.i4.not = icmp eq i32 4, 0
- br i1 %cmp.i4.not, label %_Z4mainj.exit, label %for.body.i
+ %cmp = icmp eq i32 4, 0
+ br i1 %cmp, label %_Z4mainj.exit, label %for.body.i
for.body.i: ; preds = %entry, %for.body.i
- %i.0.i5 = phi i32 [ %inc.i, %for.body.i ], [ 0, %entry ]
- %1 = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 4, i32 %i.0.i5, ptr nonnull @Out.str)
- %2 = tail call noundef i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", i32, 1, 0) %1, i8 1)
- %inc.i = add nuw nsw i32 %i.0.i5, 1
- %exitcond.not = icmp eq i32 %inc.i, 4
- br i1 %exitcond.not, label %_Z4mainj.exit, label %for.body.i
+ %phi = phi i32 [ %inc.loop, %for.body.i ], [ 0, %entry ]
+ %binding = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 4, i32 %phi, ptr nonnull @Out.str)
+ %inc.counter = tail call noundef i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", i32, 1, 0) %binding, i8 1)
+ %inc.loop = add nuw nsw i32 %phi, 1
+ %exitcond = icmp eq i32 %inc.loop, 4
+ br i1 %exitcond, label %_Z4mainj.exit, label %for.body.i
_Z4mainj.exit: ; preds = %for.body.i, %entry
ret void
diff --git a/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop_nuri.ll b/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop_nuri.ll
new file mode 100644
index 0000000000000..40d0c0a76931e
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop_nuri.ll
@@ -0,0 +1,27 @@
+; RUN: opt -S -dxil-intrinsic-expansion -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
+
+; The goal of this test it to make sure compilation finishes successfully,
+; in bad case it should timeout.
+
+
+ at Out.str = private unnamed_addr constant [4 x i8] c"Out\00", align 1
+; CHECK-LABEL: define void @main
+; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 %phi, i1 true)
+
+define void @main() local_unnamed_addr {
+entry:
+ %cmp = icmp eq i32 4, 0
+ br i1 %cmp, label %_Z4mainj.exit, label %for.body.i
+
+for.body.i: ; preds = %entry, %for.body.i
+ %phi = phi i32 [ %inc.loop, %for.body.i ], [ 0, %entry ]
+ %nuri = tail call noundef i32 @llvm.dx.resource.nonuniformindex(i32 %phi)
+ %binding = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 4, i32 %nuri, ptr nonnull @Out.str)
+ %inc.counter = tail call noundef i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", i32, 1, 0) %binding, i8 1)
+ %inc.loop = add nuw nsw i32 %phi, 1
+ %exitcond = icmp eq i32 %inc.loop, 4
+ br i1 %exitcond, label %_Z4mainj.exit, label %for.body.i
+
+_Z4mainj.exit: ; preds = %for.body.i, %entry
+ ret void
+}
>From 4b2d051176dae1459084de138f53e6126e9a369f Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Mon, 30 Mar 2026 18:11:33 -0700
Subject: [PATCH 6/9] check immediate uses for nuri call
---
llvm/lib/Target/DirectX/DXILOpLowering.cpp | 10 +++++++
.../DirectX/is_nonuniform_within_loop_nuri.ll | 26 ++++++++-----------
2 files changed, 21 insertions(+), 15 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILOpLowering.cpp b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
index 995e5311b5a66..d9155c57b1943 100644
--- a/llvm/lib/Target/DirectX/DXILOpLowering.cpp
+++ b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
@@ -266,6 +266,16 @@ class OpLowerer {
Intrinsic::dx_resource_nonuniformindex)
return true;
}
+
+ for (Use &U : V->uses()) {
+ if (auto *CI = dyn_cast<CallInst>(U.getUser())) {
+ if (CI->getCalledFunction() &&
+ CI->getCalledFunction()->getIntrinsicID() ==
+ Intrinsic::dx_resource_nonuniformindex)
+ return true;
+ }
+ }
+
if (auto *U = llvm::dyn_cast<llvm::User>(V)) {
for (llvm::Value *Op : U->operands()) {
if (isa<llvm::Constant>(Op))
diff --git a/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop_nuri.ll b/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop_nuri.ll
index 40d0c0a76931e..587438549c5fd 100644
--- a/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop_nuri.ll
+++ b/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop_nuri.ll
@@ -1,27 +1,23 @@
; RUN: opt -S -dxil-intrinsic-expansion -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
-; The goal of this test it to make sure compilation finishes successfully,
-; in bad case it should timeout.
-
@Out.str = private unnamed_addr constant [4 x i8] c"Out\00", align 1
+
; CHECK-LABEL: define void @main
; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 %phi, i1 true)
-
define void @main() local_unnamed_addr {
entry:
- %cmp = icmp eq i32 4, 0
- br i1 %cmp, label %_Z4mainj.exit, label %for.body.i
+ br label %while.body.i
-for.body.i: ; preds = %entry, %for.body.i
- %phi = phi i32 [ %inc.loop, %for.body.i ], [ 0, %entry ]
- %nuri = tail call noundef i32 @llvm.dx.resource.nonuniformindex(i32 %phi)
- %binding = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 4, i32 %nuri, ptr nonnull @Out.str)
- %inc.counter = tail call noundef i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", i32, 1, 0) %binding, i8 1)
- %inc.loop = add nuw nsw i32 %phi, 1
- %exitcond = icmp eq i32 %inc.loop, 4
- br i1 %exitcond, label %_Z4mainj.exit, label %for.body.i
+while.body.i:
+ %phi = phi i32 [ 0, %entry ], [ %inc, %while.body.i ]
+ %binding = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 4, i32 %phi, ptr nonnull @Out.str)
+ %update.counter = tail call noundef i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", i32, 1, 0) %binding, i8 1)
+ %inc = add nuw nsw i32 %phi, 1
+ %nuri = tail call noundef i32 @llvm.dx.resource.nonuniformindex(i32 %inc)
+ %cmp = icmp ult i32 %nuri, 4
+ br i1 %cmp, label %while.body.i, label %exit
-_Z4mainj.exit: ; preds = %for.body.i, %entry
+exit:
ret void
}
>From 79d39c2f8d800bf68590513c70296d292427a6e7 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Wed, 1 Apr 2026 12:35:50 -0700
Subject: [PATCH 7/9] update logic so any path that pass through nuri leads to
true
---
llvm/lib/Target/DirectX/DXILOpLowering.cpp | 58 +++++++++----------
.../DirectX/is_nonuniform_within_loop_nuri.ll | 2 +-
2 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILOpLowering.cpp b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
index d9155c57b1943..8bb4e6f2a39c4 100644
--- a/llvm/lib/Target/DirectX/DXILOpLowering.cpp
+++ b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
@@ -39,6 +39,7 @@ using namespace llvm::dxil;
namespace {
class OpLowerer {
Module &M;
+
DXILOpBuilder OpBuilder;
DXILResourceMap &DRM;
DXILResourceTypeMap &DRTM;
@@ -247,46 +248,46 @@ class OpLowerer {
NameGlobal->removeFromParent();
}
- bool hasNonUniformIndex(Value *IndexOp) {
- if (isa<llvm::Constant>(IndexOp))
+ bool hasNonUniformIndex(Value *Val, SmallPtrSet<Value *, 16> &Visited) {
+ if (isa<llvm::Constant>(Val))
return false;
- SmallVector<Value *> WorkList;
- SmallPtrSet<Value *, 8> Visited;
-
- WorkList.push_back(IndexOp);
+ // Avoid cycles (important for PHI nodes in loops)
+ if (!Visited.insert(Val).second)
+ return false;
- while (!WorkList.empty()) {
- Value *V = WorkList.pop_back_val();
- if (!Visited.insert(V).second)
- continue;
+ // Base case: is this value itself a call to our intrinsic?
+ if (auto *II = dyn_cast<IntrinsicInst>(Val))
+ if (II->getIntrinsicID() == Intrinsic::dx_resource_nonuniformindex)
+ return true;
- if (auto *CI = dyn_cast<CallInst>(V)) {
- if (CI->getCalledFunction()->getIntrinsicID() ==
- Intrinsic::dx_resource_nonuniformindex)
+ // If it's a PHI node, check ALL incoming values —
+ // taint from ANY predecessor counts
+ if (auto *Phi = dyn_cast<PHINode>(Val)) {
+ for (Value *Incoming : Phi->incoming_values())
+ if (hasNonUniformIndex(Incoming, Visited))
return true;
- }
+ return false;
+ }
- for (Use &U : V->uses()) {
- if (auto *CI = dyn_cast<CallInst>(U.getUser())) {
- if (CI->getCalledFunction() &&
- CI->getCalledFunction()->getIntrinsicID() ==
- Intrinsic::dx_resource_nonuniformindex)
+ if (auto *Inst = dyn_cast<Instruction>(Val)) {
+ if (Inst->getNumOperands() > 0 && !Inst->isTerminator()) {
+ for (Value *Op : Inst->operands())
+ if (hasNonUniformIndex(Op, Visited))
return true;
- }
- }
-
- if (auto *U = llvm::dyn_cast<llvm::User>(V)) {
- for (llvm::Value *Op : U->operands()) {
- if (isa<llvm::Constant>(Op))
- continue;
- WorkList.push_back(Op);
- }
}
}
+
return false;
}
+ bool hasNonUniformIndex(Value *IndexOp) {
+ SmallVector<Value *> WorkList;
+ SmallPtrSet<Value *, 16> Visited;
+
+ return hasNonUniformIndex(IndexOp, Visited);
+ }
+
Error validateRawBufferElementIndex(Value *Resource, Value *ElementIndex) {
bool IsStructured =
cast<RawBufferExtType>(Resource->getType())->isStructured();
@@ -325,7 +326,6 @@ class OpLowerer {
if (Binding.LowerBound != 0)
IndexOp = IRB.CreateAdd(IndexOp,
ConstantInt::get(Int32Ty, Binding.LowerBound));
-
bool HasNonUniformIndex =
(Binding.Size == 1) ? false : hasNonUniformIndex(IndexOp);
std::array<Value *, 4> Args{
diff --git a/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop_nuri.ll b/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop_nuri.ll
index 587438549c5fd..81c5b154accc4 100644
--- a/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop_nuri.ll
+++ b/llvm/test/CodeGen/DirectX/is_nonuniform_within_loop_nuri.ll
@@ -10,7 +10,7 @@ entry:
br label %while.body.i
while.body.i:
- %phi = phi i32 [ 0, %entry ], [ %inc, %while.body.i ]
+ %phi = phi i32 [ 0, %entry ], [ %nuri, %while.body.i ]
%binding = tail call target("dx.RawBuffer", i32, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 4, i32 %phi, ptr nonnull @Out.str)
%update.counter = tail call noundef i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", i32, 1, 0) %binding, i8 1)
%inc = add nuw nsw i32 %phi, 1
>From d50ab38791ed136da9a3cc04433e95a8f3f18140 Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Wed, 1 Apr 2026 12:38:41 -0700
Subject: [PATCH 8/9] clean up
---
llvm/lib/Target/DirectX/DXILOpLowering.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILOpLowering.cpp b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
index 8bb4e6f2a39c4..c11b2866265ec 100644
--- a/llvm/lib/Target/DirectX/DXILOpLowering.cpp
+++ b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
@@ -39,7 +39,6 @@ using namespace llvm::dxil;
namespace {
class OpLowerer {
Module &M;
-
DXILOpBuilder OpBuilder;
DXILResourceMap &DRM;
DXILResourceTypeMap &DRTM;
@@ -277,7 +276,6 @@ class OpLowerer {
return true;
}
}
-
return false;
}
@@ -326,6 +324,7 @@ class OpLowerer {
if (Binding.LowerBound != 0)
IndexOp = IRB.CreateAdd(IndexOp,
ConstantInt::get(Int32Ty, Binding.LowerBound));
+
bool HasNonUniformIndex =
(Binding.Size == 1) ? false : hasNonUniformIndex(IndexOp);
std::array<Value *, 4> Args{
>From c644221050d22e8a6e1b6a7e798567ae1f53e1ad Mon Sep 17 00:00:00 2001
From: Joao Saffran <joaosaffranllvm at gmail.com>
Date: Wed, 1 Apr 2026 14:38:57 -0700
Subject: [PATCH 9/9] clean up
---
llvm/lib/Target/DirectX/DXILOpLowering.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILOpLowering.cpp b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
index c11b2866265ec..9778cb158fc31 100644
--- a/llvm/lib/Target/DirectX/DXILOpLowering.cpp
+++ b/llvm/lib/Target/DirectX/DXILOpLowering.cpp
@@ -256,8 +256,8 @@ class OpLowerer {
return false;
// Base case: is this value itself a call to our intrinsic?
- if (auto *II = dyn_cast<IntrinsicInst>(Val))
- if (II->getIntrinsicID() == Intrinsic::dx_resource_nonuniformindex)
+ if (auto *CI = dyn_cast<CallInst>(Val))
+ if (CI->getIntrinsicID() == Intrinsic::dx_resource_nonuniformindex)
return true;
// If it's a PHI node, check ALL incoming values —
More information about the llvm-commits
mailing list