[llvm] [X86] matchAddressRecursively - move ZERO_EXTEND patterns into matchIndexRecursively (PR #85081)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 13 07:28:22 PDT 2024
================
@@ -2278,18 +2278,27 @@ static bool foldMaskedShiftToBEXTR(SelectionDAG &DAG, SDValue N,
return false;
}
-// Attempt to peek further into a scaled index register, collecting additional
-// extensions / offsets / etc. Returns /p N if we can't peek any further.
-SDValue X86DAGToDAGISel::matchIndexRecursively(SDValue N,
- X86ISelAddressMode &AM,
- unsigned Depth) {
+// Change the return type of matchIndexRecursively to std::optional<SDValue> to
+// make it easier for caller to tell whether the match is successful. Attempt to
+// peek further into a scaled index register, collecting additional extensions /
+// offsets / etc. Returns /p N if we can't peek any further.
+std::optional<SDValue>
+X86DAGToDAGISel::matchIndexRecursively(SDValue N, X86ISelAddressMode &AM,
+ unsigned Depth) {
assert(AM.IndexReg.getNode() == nullptr && "IndexReg already matched");
assert((AM.Scale == 1 || AM.Scale == 2 || AM.Scale == 4 || AM.Scale == 8) &&
"Illegal index scale");
+ auto adapter = [this, &AM, &Depth](SDValue N) -> SDValue {
+ auto ret_val = matchIndexRecursively(N, AM, Depth + 1);
+ if (ret_val)
+ return ret_val.value();
+ return N;
----------------
RKSimon wrote:
this can all be reduced to
```
return matchIndexRecursively(N, AM, Depth + 1).value_or(N);
```
https://github.com/llvm/llvm-project/pull/85081
More information about the llvm-commits
mailing list