[llvm] e2cb07c - [CodeGen] Fix incorrect insertion point selection for reduction nodes in ComplexDeinterleavingPass
Igor Kirillov via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 31 03:38:48 PDT 2023
Author: Igor Kirillov
Date: 2023-08-31T10:38:01Z
New Revision: e2cb07c322e85604dc48f9caec52b3570db0e1d8
URL: https://github.com/llvm/llvm-project/commit/e2cb07c322e85604dc48f9caec52b3570db0e1d8
DIFF: https://github.com/llvm/llvm-project/commit/e2cb07c322e85604dc48f9caec52b3570db0e1d8.diff
LOG: [CodeGen] Fix incorrect insertion point selection for reduction nodes in ComplexDeinterleavingPass
When replacing ComplexDeinterleavingPass::ReductionOperation, we can do it
either from the Real or Imaginary part. The correct way is to take whichever
is later in the BasicBlock, but before the patch, we just always took the
Real part.
Fixes https://github.com/llvm/llvm-project/issues/65044
Differential Revision: https://reviews.llvm.org/D159209
Added:
Modified:
llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp
llvm/test/CodeGen/AArch64/complex-deinterleaving-crash.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp b/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp
index 952f454f8f6a28..7979ac9a5fb792 100644
--- a/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp
+++ b/llvm/lib/CodeGen/ComplexDeinterleavingPass.cpp
@@ -1424,7 +1424,17 @@ bool ComplexDeinterleavingGraph::identifyNodes(Instruction *RootI) {
// CompositeNode we should choose only one either Real or Imag instruction to
// use as an anchor for generating complex instruction.
auto It = RootToNode.find(RootI);
- if (It != RootToNode.end() && It->second->Real == RootI) {
+ if (It != RootToNode.end()) {
+ auto RootNode = It->second;
+ assert(RootNode->Operation ==
+ ComplexDeinterleavingOperation::ReductionOperation);
+ // Find out which part, Real or Imag, comes later, and only if we come to
+ // the latest part, add it to OrderedRoots.
+ auto *R = cast<Instruction>(RootNode->Real);
+ auto *I = cast<Instruction>(RootNode->Imag);
+ auto *ReplacementAnchor = R->comesBefore(I) ? I : R;
+ if (ReplacementAnchor != RootI)
+ return false;
OrderedRoots.push_back(RootI);
return true;
}
diff --git a/llvm/test/CodeGen/AArch64/complex-deinterleaving-crash.ll b/llvm/test/CodeGen/AArch64/complex-deinterleaving-crash.ll
index e2216f9ece6b9f..68cb29f8f5c8f8 100644
--- a/llvm/test/CodeGen/AArch64/complex-deinterleaving-crash.ll
+++ b/llvm/test/CodeGen/AArch64/complex-deinterleaving-crash.ll
@@ -1,4 +1,4 @@
-; XFAIL: *
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
; RUN: llc %s --mattr=+complxnum -o - | FileCheck %s
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-ni:1-p2:32:8:8:32-ni:2"
@@ -6,6 +6,10 @@ target triple = "aarch64-none-linux-gnu"
; Check that deinterleaving pass doesn't generate broken IR
define void @check_deinterleave_crash() #0 {
+; CHECK-LABEL: check_deinterleave_crash:
+; CHECK: // %bb.0: // %bb
+; CHECK-NEXT: mov x8, xzr
+; CHECK-NEXT: str wzr, [x8]
bb:
br label %bb173
More information about the llvm-commits
mailing list