Skip to content

Commit 2762e67

Browse files
committed
[PowerPC] Fix a crash in POWER 9 setb peephole
Variable InnerIsSel references FalseRes, while FalseRes might be zext/sext. So InnerIsSel should reference SetOrSelCC, otherwise a crash will happen. Reviewed By: steven.zhang Differential Revision: https://reviews.llvm.org/D90142
1 parent 1bd433b commit 2762e67

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4233,8 +4233,10 @@ static bool mayUseP9Setb(SDNode *N, const ISD::CondCode &CC, SelectionDAG *DAG,
42334233
(FalseRes.getOpcode() != ISD::SELECT_CC || CC != ISD::SETEQ)))
42344234
return false;
42354235

4236-
bool InnerIsSel = FalseRes.getOpcode() == ISD::SELECT_CC;
4237-
SDValue SetOrSelCC = InnerIsSel ? FalseRes : FalseRes.getOperand(0);
4236+
SDValue SetOrSelCC = FalseRes.getOpcode() == ISD::SELECT_CC
4237+
? FalseRes
4238+
: FalseRes.getOperand(0);
4239+
bool InnerIsSel = SetOrSelCC.getOpcode() == ISD::SELECT_CC;
42384240
if (SetOrSelCC.getOpcode() != ISD::SETCC &&
42394241
SetOrSelCC.getOpcode() != ISD::SELECT_CC)
42404242
return false;

llvm/test/CodeGen/PowerPC/ppc64-P9-setb.ll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,3 +1328,18 @@ define i64 @setbn3(float %a, float %b) {
13281328
; CHECK: isel
13291329
; CHECK: blr
13301330
}
1331+
1332+
; Verify this case doesn't crash
1333+
define void @setbn4(i128 %0, i32* %sel.out) {
1334+
entry:
1335+
; CHECK-LABEL: setbn4:
1336+
; CHECK-NOT: {{\<setb\>}}
1337+
; CHECK: isel
1338+
; CHECK: blr
1339+
%c1 = icmp ult i128 %0, 5192296858534827628530496329220096
1340+
%c2 = icmp ugt i128 %0, 5192296858534827628530496329220096
1341+
%ext = zext i1 %c2 to i32
1342+
%sel = select i1 %c1, i32 -1, i32 %ext
1343+
store i32 %sel, i32* %sel.out, align 4
1344+
ret void
1345+
}

0 commit comments

Comments
 (0)