From 018c368d384cb32c7a9985a87b89d2d713051c14 Mon Sep 17 00:00:00 2001 From: Jonas Paulsson Date: Mon, 26 Jun 2017 13:38:27 +0000 Subject: [PATCH] [SystemZ] Add a check against zero before calling getTestUnderMaskCond() Csmith discovered that this function can be called with a zero argument, in which case an assert for this triggered. This patch also adds a guard before the other call to this function since it was missing, although the test only covers the case where it was discovered. Reduced test case attached as CodeGen/SystemZ/int-cmp-54.ll. Review: Ulrich Weigand git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306287 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/SystemZ/SystemZISelLowering.cpp | 2 ++ test/CodeGen/SystemZ/int-cmp-54.ll | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 test/CodeGen/SystemZ/int-cmp-54.ll diff --git a/lib/Target/SystemZ/SystemZISelLowering.cpp b/lib/Target/SystemZ/SystemZISelLowering.cpp index 080f4ae2a3df..fef4a8c92a36 100644 --- a/lib/Target/SystemZ/SystemZISelLowering.cpp +++ b/lib/Target/SystemZ/SystemZISelLowering.cpp @@ -2054,6 +2054,7 @@ static void adjustForTestUnderMask(SelectionDAG &DAG, const SDLoc &DL, if (NewC.ICmpType != SystemZICMP::SignedOnly && NewC.Op0.getOpcode() == ISD::SHL && isSimpleShift(NewC.Op0, ShiftVal) && + (MaskVal >> ShiftVal != 0) && (NewCCMask = getTestUnderMaskCond(BitSize, NewC.CCMask, MaskVal >> ShiftVal, CmpVal >> ShiftVal, @@ -2063,6 +2064,7 @@ static void adjustForTestUnderMask(SelectionDAG &DAG, const SDLoc &DL, } else if (NewC.ICmpType != SystemZICMP::SignedOnly && NewC.Op0.getOpcode() == ISD::SRL && isSimpleShift(NewC.Op0, ShiftVal) && + (MaskVal << ShiftVal != 0) && (NewCCMask = getTestUnderMaskCond(BitSize, NewC.CCMask, MaskVal << ShiftVal, CmpVal << ShiftVal, diff --git a/test/CodeGen/SystemZ/int-cmp-54.ll b/test/CodeGen/SystemZ/int-cmp-54.ll new file mode 100644 index 000000000000..6e157959a19c --- /dev/null +++ b/test/CodeGen/SystemZ/int-cmp-54.ll @@ -0,0 +1,20 @@ +; Check that custom handling of SETCC does not crash +; +; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 + +@g_39 = external global [4 x i8], align 2 +@g_2166 = external global <{ i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i32 }>, align 8 + +; Function Attrs: nounwind +define void @main() local_unnamed_addr #0 { + %1 = load volatile i88, i88* bitcast (<{ i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i32 }>* @g_2166 to i88*), align 8 + %2 = lshr i88 %1, 87 + %3 = trunc i88 %2 to i64 + %4 = icmp sgt i64 %3, 9293 + %5 = zext i1 %4 to i32 + %6 = lshr i32 %5, 0 + %7 = shl i32 %6, 6 + %8 = trunc i32 %7 to i8 + store i8 %8, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @g_39, i64 0, i64 1), align 1 + unreachable +}