[llvm] [AMDGPU] Fix set_inactive known bits to intersect both operands (PR #201817)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 5 04:52:21 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Arseniy Obolenskiy (aobolensk)
<details>
<summary>Changes</summary>
SimplifyDemandedBitsForTargetNode grouped amdgcn_set_inactive with the single-source readfirstlane/readlane/wwm, taking known bits from operand 1 only
Handle the data from the operand 2 inactive lanes as well
---
Full diff: https://github.com/llvm/llvm-project/pull/201817.diff
2 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp (+15-1)
- (modified) llvm/test/CodeGen/AMDGPU/llvm.amdgcn.set.inactive.ll (+27)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
index 78fcd0fd24b6f..8f264af6c7831 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
@@ -5848,13 +5848,27 @@ bool AMDGPUTargetLowering::SimplifyDemandedBitsForTargetNode(
switch (Op.getConstantOperandVal(0)) {
case Intrinsic::amdgcn_readfirstlane:
case Intrinsic::amdgcn_readlane:
- case Intrinsic::amdgcn_set_inactive:
case Intrinsic::amdgcn_wwm: {
if (SimplifyDemandedBits(Op.getOperand(1), OriginalDemandedBits,
OriginalDemandedElts, Known, TLO, Depth + 1))
return true;
break;
}
+ case Intrinsic::amdgcn_set_inactive:
+ case Intrinsic::amdgcn_set_inactive_chain_arg: {
+ // The result is operand 1 in active lanes and operand 2 in inactive
+ // lanes, so the known bits are the intersection of both operands.
+ KnownBits KnownValue, KnownInactive;
+ if (SimplifyDemandedBits(Op.getOperand(1), OriginalDemandedBits,
+ OriginalDemandedElts, KnownValue, TLO, Depth + 1))
+ return true;
+ if (SimplifyDemandedBits(Op.getOperand(2), OriginalDemandedBits,
+ OriginalDemandedElts, KnownInactive, TLO,
+ Depth + 1))
+ return true;
+ Known = KnownValue.intersectWith(KnownInactive);
+ break;
+ }
default:
break;
}
diff --git a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.set.inactive.ll b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.set.inactive.ll
index ce03681f2eca8..965903b3c3d57 100644
--- a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.set.inactive.ll
+++ b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.set.inactive.ll
@@ -504,6 +504,33 @@ define amdgpu_kernel void @set_inactive_p6(ptr addrspace(1) %out, ptr addrspace(
ret void
}
+; The result of set_inactive with a constant value operand must not be
+; constant-folded away: SimplifyDemandedBits must intersect the known bits of
+; both operands, so the inactive value (0x55555555) is preserved through the
+; demanded-bits mask.
+define amdgpu_kernel void @set_inactive_const_value_demanded(ptr addrspace(1) %out) {
+; GCN-LABEL: set_inactive_const_value_demanded:
+; GCN: ; %bb.0:
+; GCN-NEXT: s_load_dwordx2 s[0:1], s[4:5], 0x24
+; GCN-NEXT: s_mov_b32 s3, 0xf000
+; GCN-NEXT: s_mov_b32 s2, -1
+; GCN-NEXT: v_mov_b32_e32 v1, 0xaaaaaaaa
+; GCN-NEXT: s_or_saveexec_b64 s[4:5], -1
+; GCN-NEXT: v_mov_b32_e32 v0, 0x55555555
+; GCN-NEXT: v_cndmask_b32_e64 v0, v0, v1, s[4:5]
+; GCN-NEXT: v_and_b32_e32 v0, 0xffff, v0
+; GCN-NEXT: s_mov_b64 exec, s[4:5]
+; GCN-NEXT: v_mov_b32_e32 v1, v0
+; GCN-NEXT: s_waitcnt lgkmcnt(0)
+; GCN-NEXT: buffer_store_dword v1, off, s[0:3], 0
+; GCN-NEXT: s_endpgm
+ %tmp.0 = call i32 @llvm.amdgcn.set.inactive.i32(i32 -1431655766, i32 1431655765) #0
+ %and = and i32 %tmp.0, 65535
+ %tmp = call i32 @llvm.amdgcn.strict.wwm.i32(i32 %and)
+ store i32 %tmp, ptr addrspace(1) %out
+ ret void
+}
+
declare i32 @llvm.amdgcn.set.inactive.i32(i32, i32) #0
declare i64 @llvm.amdgcn.set.inactive.i64(i64, i64) #0
declare i32 @llvm.amdgcn.strict.wwm.i32(i32) #1
``````````
</details>
https://github.com/llvm/llvm-project/pull/201817
More information about the llvm-commits
mailing list