Skip to content

Commit 3c94b27

Browse files
JonPssonzmodem
authored andcommitted
[SystemZ] Bugfix in emitSelect()
When more than one SelectPseudo instruction is handled a new MBB is returned. This must not be done if that would result in leaving an undhandled isel pseudo behind in the original MBB. Fixes https://bugs.llvm.org/show_bug.cgi?id=44849. Review: Ulrich Weigand Differential Revision: https://reviews.llvm.org/D74352 (cherry picked from commit 0311e28)
1 parent fd04cb4 commit 3c94b27

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

llvm/lib/Target/SystemZ/SystemZISelLowering.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6859,8 +6859,6 @@ SystemZTargetLowering::emitSelect(MachineInstr &MI,
68596859
for (MachineBasicBlock::iterator NextMIIt =
68606860
std::next(MachineBasicBlock::iterator(MI));
68616861
NextMIIt != MBB->end(); ++NextMIIt) {
6862-
if (NextMIIt->definesRegister(SystemZ::CC))
6863-
break;
68646862
if (isSelectPseudo(*NextMIIt)) {
68656863
assert(NextMIIt->getOperand(3).getImm() == CCValid &&
68666864
"Bad CCValid operands since CC was not redefined.");
@@ -6871,6 +6869,9 @@ SystemZTargetLowering::emitSelect(MachineInstr &MI,
68716869
}
68726870
break;
68736871
}
6872+
if (NextMIIt->definesRegister(SystemZ::CC) ||
6873+
NextMIIt->usesCustomInsertionHook())
6874+
break;
68746875
bool User = false;
68756876
for (auto SelMI : Selects)
68766877
if (NextMIIt->readsVirtualRegister(SelMI->getOperand(0).getReg())) {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# RUN: llc -mtriple=s390x-linux-gnu -mcpu=z10 -run-pass=finalize-isel -o - %s \
2+
# RUN: | FileCheck %s
3+
#
4+
# Test that an instruction (ZEXT128) that uses custom insertion gets treated
5+
# correctly also when it lies between two Select instructions that could
6+
# potentially be handled together.
7+
#
8+
# CHECK-LABEL: bb.0.entry:
9+
# CHECK-NOT: ZEXT128
10+
11+
--- |
12+
declare void @bar(i32)
13+
define i32 @fun() { entry: ret i32 0 }
14+
---
15+
name: fun
16+
body: |
17+
bb.0.entry:
18+
%1:addr64bit = IMPLICIT_DEF
19+
%0:gr32bit = LLC %1, 0, $noreg :: (load 1 from `i8* undef`)
20+
CHI killed %0, 0, implicit-def $cc
21+
%2:gr32bit = LHI 2
22+
%3:gr32bit = LHI 8
23+
%4:gr32bit = Select32 killed %3, killed %2, 14, 8, implicit $cc
24+
%5:gr32bit = LHI 128
25+
%7:gr64bit = IMPLICIT_DEF
26+
%6:gr64bit = INSERT_SUBREG %7, killed %5, %subreg.subreg_l32
27+
%8:gr128bit = ZEXT128 killed %6
28+
%10:addr64bit = IMPLICIT_DEF
29+
%9:gr128bit = DL %8, %10, 0, $noreg :: (load 4 from `i64* undef` + 4)
30+
%11:gr32bit = COPY %9.subreg_l32
31+
%12:gr64bit = LGHI 2
32+
%13:gr64bit = LGHI 8
33+
%14:gr64bit = Select64 killed %13, killed %12, 14, 8, implicit $cc
34+
CR %4, %11, implicit-def $cc
35+
%15:gr32bit = Select32 %11, %4, 14, 4, implicit $cc
36+
ADJCALLSTACKDOWN 0, 0
37+
$r2d = COPY %14
38+
CallBRASL @bar, $r2d, csr_systemz, implicit-def dead $r14d, implicit-def dead $cc, implicit $fpc
39+
ADJCALLSTACKUP 0, 0
40+
$r2l = COPY %15
41+
Return implicit $r2l
42+
43+
...

0 commit comments

Comments
 (0)