[llvm] [WIP][Assume] Generic assume-based uniformity optimization (PR #160670)
Sameer Sahasrabuddhe via llvm-commits
llvm-commits at lists.llvm.org
Sat Oct 4 21:10:14 PDT 2025
================
@@ -3540,6 +3540,79 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
}
}
+ // Basic assume equality optimization: assume(x == c) -> replace dominated uses of x with c
+ if (auto *ICmp = dyn_cast<ICmpInst>(IIOperand)) {
+ if (ICmp->getPredicate() == ICmpInst::ICMP_EQ) {
+ Value *LHS = ICmp->getOperand(0);
+ Value *RHS = ICmp->getOperand(1);
+ Value *Variable = nullptr;
+ Constant *ConstantVal = nullptr;
+
+ if (auto *C = dyn_cast<Constant>(RHS)) {
+ Variable = LHS;
+ ConstantVal = C;
+ } else if (auto *C = dyn_cast<Constant>(LHS)) {
+ Variable = RHS;
+ ConstantVal = C;
+ }
+
+ if (Variable && ConstantVal && Variable->hasUseList()) {
+ SmallVector<Use *, 8> DominatedUses;
+ for (Use &U : Variable->uses()) {
+ if (auto *UseInst = dyn_cast<Instruction>(U.getUser())) {
+ if (UseInst != II && UseInst != ICmp &&
+ isValidAssumeForContext(II, UseInst, &DT)) {
+ DominatedUses.push_back(&U);
+ }
+ }
+ }
+
+ for (Use *U : DominatedUses) {
+ U->set(ConstantVal);
+ Worklist.pushValue(U->getUser());
+ }
+
+ if (!DominatedUses.empty()) {
+ Worklist.pushValue(Variable);
+ }
+ }
+ }
+ }
+
+ // Optimize AMDGPU ballot patterns in assumes:
+ // assume(ballot(cmp) == -1) means cmp is true on all active lanes
+ // We can replace uses of cmp with true in dominated contexts
+ Value *BallotInst;
+ if (match(IIOperand, m_SpecificICmp(ICmpInst::ICMP_EQ, m_Value(BallotInst), m_AllOnes()))) {
+ if (auto *IntrCall = dyn_cast<IntrinsicInst>(BallotInst)) {
+ if (IntrCall->getIntrinsicID() == Intrinsic::amdgcn_ballot) {
+ Value *BallotArg = IntrCall->getArgOperand(0);
+ if (BallotArg->getType()->isIntegerTy(1) && BallotArg->hasUseList()) {
+ // Find dominated uses and replace with true
+ SmallVector<Use *, 8> DominatedUses;
----------------
ssahasra wrote:
```suggestion
SmallVector<Use *, 8> Uses;
```
Everywhere in the code, *dominated* is always true and shouldn't be included in the name.
https://github.com/llvm/llvm-project/pull/160670
More information about the llvm-commits
mailing list