diff options
| author | Jonas Paulsson <paulsson@linux.vnet.ibm.com> | 2017-06-26 13:38:27 +0000 |
|---|---|---|
| committer | Jonas Paulsson <paulsson@linux.vnet.ibm.com> | 2017-06-26 13:38:27 +0000 |
| commit | 8c33647ba10cfd1399999154d3c8d9685723f7b7 (patch) | |
| tree | 0cd5107591dab29f988a029bdc26b8e3a10f0efc | |
| parent | ce7e187f84bfa75edd54ecc960a7999ed4c52886 (diff) | |
| download | bcm5719-llvm-8c33647ba10cfd1399999154d3c8d9685723f7b7.tar.gz bcm5719-llvm-8c33647ba10cfd1399999154d3c8d9685723f7b7.zip | |
[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
llvm-svn: 306287
| -rw-r--r-- | llvm/lib/Target/SystemZ/SystemZISelLowering.cpp | 2 | ||||
| -rw-r--r-- | llvm/test/CodeGen/SystemZ/int-cmp-54.ll | 20 |
2 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp index 080f4ae2a3d..fef4a8c92a3 100644 --- a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp +++ b/llvm/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/llvm/test/CodeGen/SystemZ/int-cmp-54.ll b/llvm/test/CodeGen/SystemZ/int-cmp-54.ll new file mode 100644 index 00000000000..6e157959a19 --- /dev/null +++ b/llvm/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 +} |

