[llvm] [GISel][Combine] Enhance combining on G_BUILD_VECTOR (PR #87831)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 5 14:33:55 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-globalisel
Author: None (darkbuck)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/87831.diff
2 Files Affected:
- (modified) llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp (+4-2)
- (modified) llvm/test/CodeGen/AArch64/GlobalISel/combine-extract-vec-elt.mir (+31)
``````````diff
diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
index 719209e0edd5fb..31f2356f9ba938 100644
--- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -2925,8 +2925,10 @@ bool CombinerHelper::matchCombineInsertVecElts(
}
return true;
}
- // If we didn't end in a G_IMPLICIT_DEF, bail out.
- return TmpInst->getOpcode() == TargetOpcode::G_IMPLICIT_DEF;
+ // If we didn't end in a G_IMPLICIT_DEF and the source is not fully
+ // overwritten, bail out.
+ return TmpInst->getOpcode() == TargetOpcode::G_IMPLICIT_DEF ||
+ all_of(MatchInfo, [](Register Reg) { return !!Reg; });
}
void CombinerHelper::applyCombineInsertVecElts(
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/combine-extract-vec-elt.mir b/llvm/test/CodeGen/AArch64/GlobalISel/combine-extract-vec-elt.mir
index c2a38e26676cf9..a65b43d33e4911 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/combine-extract-vec-elt.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/combine-extract-vec-elt.mir
@@ -220,6 +220,37 @@ body: |
$x0 = COPY %extract(s64)
RET_ReallyLR implicit $x0
+...
+---
+# This test checks that this combine runs after the insertvec->build_vector
+name: extract_from_insert2
+tracksRegLiveness: true
+liveins:
+ - { reg: '$x0' }
+ - { reg: '$x1' }
+frameInfo:
+ maxAlignment: 1
+body: |
+ bb.1:
+ liveins: $q0, $x0, $x1
+ ; CHECK-LABEL: name: extract_from_insert2
+ ; CHECK: liveins: $q0, $x0, $x1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: %arg1:_(s64) = COPY $x0
+ ; CHECK-NEXT: %arg2:_(s64) = COPY $x1
+ ; CHECK-NEXT: %ins2:_(<2 x s64>) = G_BUILD_VECTOR %arg1(s64), %arg2(s64)
+ ; CHECK-NEXT: $q0 = COPY %ins2(<2 x s64>)
+ ; CHECK-NEXT: RET_ReallyLR implicit $q0
+ %arg0:_(<2 x s64>) = COPY $q0
+ %arg1:_(s64) = COPY $x0
+ %arg2:_(s64) = COPY $x1
+ %zero:_(s32) = G_CONSTANT i32 0
+ %one:_(s32) = G_CONSTANT i32 1
+ %ins1:_(<2 x s64>) = G_INSERT_VECTOR_ELT %arg0, %arg1(s64), %zero(s32)
+ %ins2:_(<2 x s64>) = G_INSERT_VECTOR_ELT %ins1, %arg2(s64), %one(s32)
+ $q0 = COPY %ins2(<2 x s64>)
+ RET_ReallyLR implicit $q0
+
...
---
name: extract_from_idx_negative
``````````
</details>
https://github.com/llvm/llvm-project/pull/87831
More information about the llvm-commits
mailing list