[llvm] [SROA] Unfold gep of index select (PR #80983)

Artem Belevich via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 7 12:09:05 PST 2024


================
@@ -3937,30 +3937,63 @@ class AggLoadStoreRewriter : public InstVisitor<AggLoadStoreRewriter, bool> {
     return false;
   }
 
-  // Fold gep (select cond, ptr1, ptr2) => select cond, gep(ptr1), gep(ptr2)
+  // Fold gep (select cond, ptr1, ptr2), idx
+  //   => select cond, gep(ptr1, idx), gep(ptr2, idx)
+  // and  gep ptr, (select cond, idx1, idx2)
+  //   => select cond, gep(ptr, idx1), gep(ptr, idx2)
   bool foldGEPSelect(GetElementPtrInst &GEPI) {
-    if (!GEPI.hasAllConstantIndices())
-      return false;
+    // Check whether the GEP has exactly one select operand and all indices
+    // will become constant after the transform.
+    auto IsValidOp = [](Value *Op) {
+      return Op->getType()->isPointerTy() || isa<ConstantInt>(Op);
+    };
+
+    SelectInst *Sel = nullptr;
+    for (Value *Op : GEPI.operands()) {
+      if (auto *SI = dyn_cast<SelectInst>(Op)) {
----------------
Artem-B wrote:

Do we want to restrict it to selects of known integer values? Allowing all selects would result in splitting into GEPs that SROA would still not be able to see through.
Select of constants is always useful.
Select of one const, is partially useful.
Select of non-const is a gamble some may eventually evaluate to a known value, some would not.


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


More information about the llvm-commits mailing list