Index: llvm/lib/Analysis/TargetLibraryInfo.cpp =================================================================== --- llvm/lib/Analysis/TargetLibraryInfo.cpp +++ llvm/lib/Analysis/TargetLibraryInfo.cpp @@ -143,7 +143,8 @@ TLI.setUnavailable(LibFunc_sincospif_stret); } - if (!hasBcmp(T)) + // Memcmp has hardware support on SystemZ, so no need for bcmp. + if (!hasBcmp(T) || T.isSystemZ()) TLI.setUnavailable(LibFunc_bcmp); if (T.isMacOSX() && T.getArch() == Triple::x86 && Index: llvm/test/Transforms/InstCombine/memcmp-3.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/InstCombine/memcmp-3.ll @@ -0,0 +1,18 @@ +; RUN: opt -S -O3 < %s | FileCheck %s +; REQUIRES: systemz-registered-target +; +; Test that memcmp is not replaced with bcmp on SystemZ. + +target datalayout = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64" +target triple = "s390x-unknown-linux-gnu" + +; CHECK-LABEL: @fun +; CHECK: call signext i32 @memcmp +define i32 @fun(i8* %0, i8* %1) { + %3 = call signext i32 @memcmp(i8* %0, i8* %1, i64 2) + %4 = icmp eq i32 %3, 0 + %5 = zext i1 %4 to i32 + ret i32 %5 +} + +declare dso_local signext i32 @memcmp(i8*, i8*, i64)