[llvm] [SCEV] Simplify SCEVExpr for PHI to SCEV for operand if operands are identical (PR #115945)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 14 18:39:18 PST 2024


================
@@ -6019,6 +6019,37 @@ const SCEV *ScalarEvolution::createNodeFromSelectLikePHI(PHINode *PN) {
   return nullptr;
 }
 
+// Returns SCEV for the first operand of a phi if all phi operands have
+// identical opcodes and operands
+// eg.
+// a: %add = %a + %b
+//    br %c
+// b: %add1 = %a + %b
+//    br %c
+// c: %phi = phi [%add, a], [%add1, b]
+// scev(%phi) => scev(%add)
+const SCEV *
+ScalarEvolution::createNodeForPHIWithIdenticalOperands(PHINode *PN) {
+  BinaryOperator *CommonInst = nullptr;
+  for (Value *Incoming : PN->incoming_values()) {
+    BinaryOperator *IncomingInst = dyn_cast<BinaryOperator>(Incoming);
+    if (CommonInst) {
+      if (!(IncomingInst && CommonInst->isIdenticalTo(IncomingInst))) {
+        // Not identical, give up
+        CommonInst = nullptr;
+        break;
----------------
dtcxzyw wrote:

```suggestion
        return nullptr;
```

https://github.com/llvm/llvm-project/pull/115945


More information about the llvm-commits mailing list