[PATCH] D145223: [InstCombine] Combine binary operator of two phi node
    Nikita Popov via Phabricator via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Fri Mar 17 08:36:12 PDT 2023
    
    
  
nikic added inline comments.
================
Comment at: llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:1314
+  // %add = phi i32 [%j, %bb0], [%i, %bb1]
+  // TODO: Support other binary operators
+  Constant *C = ConstantExpr::getBinOpIdentity(BO.getOpcode(), BO.getType(),
----------------
hiraditya wrote:
> nit: any remaining operators we are still missing?
Might make more sense to mention generalization to inst simplify.
================
Comment at: llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:1318
+  if (C) {
+    llvm::SmallVector<Value *, 4> NewIncomingValues;
+    if (all_of(llvm::zip(Phi0->operands(), Phi1->operands()),
----------------
Drop `llvm::`
================
Comment at: llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:1320
+    if (all_of(llvm::zip(Phi0->operands(), Phi1->operands()),
+               [&](std::tuple<llvm::Use &, llvm::Use &> T) {
+                 auto &Phi0Use = std::get<0>(T);
----------------
This indent is ugly, I'd suggest moving this function into a variable.
================
Comment at: llvm/lib/Transforms/InstCombine/InstructionCombining.cpp:1328
+                 Value *Phi1UseV = Phi1Use.get();
+                 if (dyn_cast<Constant>(Phi0UseV) == C)
+                   NewIncomingValues.push_back(Phi1UseV);
----------------
No need to dyn_cast, just comparison is enough.
================
Comment at: llvm/test/Transforms/InstCombine/phi.ll:1642
   ret i32 %add
 }
----------------
Add a test with `sub` to show that non-commutative operator is not folded?
Repository:
  rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D145223/new/
https://reviews.llvm.org/D145223
    
    
More information about the llvm-commits
mailing list