[Mlir-commits] [mlir] [mlir] Always update ExtractValue to use last container in insert chain (PR #176588)
Tobias Gysi
llvmlistbot at llvm.org
Sun Jan 18 22:10:51 PST 2026
================
@@ -1955,50 +1964,39 @@ OpFoldResult LLVM::ExtractValueOp::fold(FoldAdaptor adaptor) {
// In the above example, %4 is folded to %arg1.
if (extractPosSize > insertPosSize &&
extractPos.take_front(insertPosSize) == insertPos) {
- container = insertValueOp.getValue().getDefiningOp();
+ container = insertValueOp.getValue();
extractPos = extractPos.drop_front(insertPosSize);
- switchedToInsertedValue = true;
continue;
}
// Case 3: Try to continue the traversal with the container value.
- unsigned min = std::min(extractPosSize, insertPosSize);
- // If one is fully prefix of the other, stop propagating back as it will
- // miss dependencies. For instance, %3 should not fold to %f0 in the
- // following example:
+ // If extract position is a prefix of insert position, stop propagating back
+ // as it will miss dependencies. For instance, %3 should not fold to %f0 in
+ // the following example:
// ```
// %1 = llvm.insertvalue %f0, %0[0, 0] :
// !llvm.array<4 x !llvm.array<4 x f32>>
// %2 = llvm.insertvalue %arr, %1[0] :
// !llvm.array<4 x !llvm.array<4 x f32>>
// %3 = llvm.extractvalue %2[0, 0] : !llvm.array<4 x !llvm.array<4 x f32>>
// ```
- if (extractPos.take_front(min) == insertPos.take_front(min))
- return result;
+ if (insertPosSize > extractPosSize &&
+ extractPos == insertPos.take_front(extractPosSize))
+ break;
// If neither a prefix, nor the exact position, we can extract out of the
// value being inserted into. Moreover, we can try again if that operand
// is itself an insertvalue expression.
- if (!switchedToInsertedValue) {
- // Do not swap out the container operand if we decided earlier to
- // continue the traversal with the inserted value (Case 2).
- getContainerMutable().assign(insertValueOp.getContainer());
- result = getResult();
- }
- container = insertValueOp.getContainer().getDefiningOp();
+ container = insertValueOp.getContainer();
}
- if (!container)
- return result;
- Attribute containerAttr;
- if (!matchPattern(container, m_Constant(&containerAttr)))
- return nullptr;
- for (int64_t pos : extractPos) {
- containerAttr = extractElementAt(containerAttr, pos);
- if (!containerAttr)
- return nullptr;
- }
- return containerAttr;
+ // If we identified a container higher up in the chain, update the position
+ // and container operands.
----------------
gysit wrote:
Thanks!
https://github.com/llvm/llvm-project/pull/176588
More information about the Mlir-commits
mailing list