Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ 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); Index: llvm/test/CodeGen/SystemZ/memcmp-03.ll =================================================================== --- /dev/null +++ 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 +}