[PATCH] D138187: [GlobalISel] Fix crash in applyShiftOfShiftedLogic caused by CSEMIRBuilder reuse instruction
chenglin.bi via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 17 21:16:00 PST 2022
bcl5980 updated this revision to Diff 476329.
bcl5980 edited the summary of this revision.
bcl5980 added a comment.
58432 to 58423
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D138187/new/
https://reviews.llvm.org/D138187
Files:
llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
llvm/test/CodeGen/AArch64/pr58423.ll
Index: llvm/test/CodeGen/AArch64/pr58423.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/AArch64/pr58423.ll
@@ -0,0 +1,15 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -global-isel -global-isel-abort=0 | FileCheck %s
+
+; this used to crash
+define i32 @f(i32 %0) {
+; CHECK-LABEL: f:
+; CHECK: // %bb.0:
+; CHECK-NEXT: lsl w8, w0, #8
+; CHECK-NEXT: orr w0, w8, w0, lsl #16
+; CHECK-NEXT: ret
+ %2 = shl i32 %0, 8
+ %3 = or i32 %0, %2
+ %4 = shl i32 %3, 8
+ ret i32 %4
+}
Index: llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
===================================================================
--- llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -1598,6 +1598,13 @@
Register Shift1 =
Builder.buildInstr(Opcode, {DestType}, {Shift1Base, Const}).getReg(0);
+ // If LogicNonShiftReg is the same to Shift1Base, and shift1 const is the same
+ // to MatchInfo.Shift2 const, CSEMIRBuilder will reuse the old shift1 when
+ // build shift2. So, if we erase MatchInfo.Shift2 at the end, actually we
+ // remove old shift1. And it will cause crash later. So erase it earlier to
+ // avoid the crash.
+ MatchInfo.Shift2->eraseFromParent();
+
Register Shift2Const = MI.getOperand(2).getReg();
Register Shift2 = Builder
.buildInstr(Opcode, {DestType},
@@ -1607,8 +1614,7 @@
Register Dest = MI.getOperand(0).getReg();
Builder.buildInstr(MatchInfo.Logic->getOpcode(), {Dest}, {Shift1, Shift2});
- // These were one use so it's safe to remove them.
- MatchInfo.Shift2->eraseFromParent();
+ // This was one use so it's safe to remove it.
MatchInfo.Logic->eraseFromParent();
MI.eraseFromParent();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D138187.476329.patch
Type: text/x-patch
Size: 1862 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221118/98c437d3/attachment.bin>
More information about the llvm-commits
mailing list