Index: llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp =================================================================== --- llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp +++ llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp @@ -608,7 +608,7 @@ return (NumParams == 3 && FTy.getReturnType()->isPointerTy() && FTy.getParamType(0) == FTy.getReturnType() && FTy.getParamType(1) == FTy.getReturnType() && - FTy.getParamType(2)->isIntegerTy()); + IsSizeTTy(FTy.getParamType(2))); case LibFunc_strcpy_chk: case LibFunc_stpcpy_chk: @@ -633,7 +633,7 @@ return (NumParams == 3 && FTy.getReturnType() == FTy.getParamType(0) && FTy.getParamType(0) == FTy.getParamType(1) && FTy.getParamType(0) == PCharTy && - FTy.getParamType(2)->isIntegerTy()); + IsSizeTTy(FTy.getParamType(2))); case LibFunc_strxfrm: return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() && @@ -648,7 +648,7 @@ return (NumParams == 3 && FTy.getReturnType()->isIntegerTy(32) && FTy.getParamType(0)->isPointerTy() && FTy.getParamType(0) == FTy.getParamType(1) && - FTy.getParamType(2)->isIntegerTy()); + IsSizeTTy(FTy.getParamType(2))); case LibFunc_strspn: case LibFunc_strcspn: Index: llvm/trunk/test/Transforms/InstCombine/strncmp-wrong-datalayout.ll =================================================================== --- llvm/trunk/test/Transforms/InstCombine/strncmp-wrong-datalayout.ll +++ llvm/trunk/test/Transforms/InstCombine/strncmp-wrong-datalayout.ll @@ -0,0 +1,16 @@ +; Test that the strncpy simplification doesn't crash if datalayout specifies +; 64 bit pointers while length is a 32 bit argument +; +; RUN: opt < %s -instcombine -S | FileCheck %s + +target datalayout = "e-p:64:64:64" + +declare i32 @strncmp(i8*, i8*, i32) + +define i32 @test6(i8* %str1, i8* %str2) { +; CHECK-LABEL: @test6( +; CHECK: call i32 @strncmp(i8* %str1, i8* %str2, i32 1) + + %temp1 = call i32 @strncmp(i8* %str1, i8* %str2, i32 1) + ret i32 %temp1 +}