diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -7902,7 +7902,7 @@ bool SelectionDAGBuilder::visitMemCmpBCmpCall(const CallInst &I) { const Value *LHS = I.getArgOperand(0), *RHS = I.getArgOperand(1); const Value *Size = I.getArgOperand(2); - const ConstantInt *CSize = dyn_cast(Size); + const ConstantSDNode *CSize = dyn_cast(getValue(Size)); if (CSize && CSize->getZExtValue() == 0) { EVT CallVT = DAG.getTargetLoweringInfo().getValueType(DAG.getDataLayout(), I.getType(), true); diff --git a/llvm/test/CodeGen/SystemZ/memcmp-03.ll b/llvm/test/CodeGen/SystemZ/memcmp-03.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/memcmp-03.ll @@ -0,0 +1,20 @@ +; Test memcmp with 0 size. + +; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s +; REQUIRES: asserts + +declare i32 @memcmp(i8* nocapture, i8* nocapture, i64) + +define hidden void @fun() { +; CHECK-LABEL: fun +entry: + %len = extractvalue [2 x i64] zeroinitializer, 1 + br i1 undef, label %end, label %call + +call: + %res = tail call signext i32 @memcmp(i8* noundef undef, i8* noundef undef, i64 noundef %len) + unreachable + +end: + unreachable +}