forked from OSchip/llvm-project
[Analysis] Validate the return type of s(n)printf like libcalls
If the sprintf function is static (as on mingw-w64, where many stdio functions are static inline wrappers), earlier optimization passes could optimize out the return value altogether, and make it void, which could break optimizations of this libcall that touch the return value. This fixes the issue discussed in PR37408 for the sprintf function. Differential Revision: https://reviews.llvm.org/D46752 llvm-svn: 332106
This commit is contained in:
parent
458506871a
commit
0d7c37756b
|
@ -692,10 +692,12 @@ bool TargetLibraryInfoImpl::isValidProtoForLibFunc(const FunctionType &FTy,
|
|||
case LibFunc_siprintf:
|
||||
case LibFunc_sprintf:
|
||||
return (NumParams >= 2 && FTy.getParamType(0)->isPointerTy() &&
|
||||
FTy.getParamType(1)->isPointerTy());
|
||||
FTy.getParamType(1)->isPointerTy() &&
|
||||
FTy.getReturnType()->isIntegerTy(32));
|
||||
case LibFunc_snprintf:
|
||||
return (NumParams == 3 && FTy.getParamType(0)->isPointerTy() &&
|
||||
FTy.getParamType(2)->isPointerTy());
|
||||
FTy.getParamType(2)->isPointerTy() &&
|
||||
FTy.getReturnType()->isIntegerTy(32));
|
||||
case LibFunc_setitimer:
|
||||
return (NumParams == 3 && FTy.getParamType(1)->isPointerTy() &&
|
||||
FTy.getParamType(2)->isPointerTy());
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
|
||||
@hello_world = constant [13 x i8] c"hello world\0A\00"
|
||||
|
||||
declare void @sprintf(i8*, i8*, ...)
|
||||
|
||||
; Check that a sprintf call, that would otherwise be optimized, but with
|
||||
; optimized out return type, doesn't crash the optimizer.
|
||||
|
||||
define void @test_simplify1(i8* %dst) {
|
||||
; CHECK-LABEL: @test_simplify1(
|
||||
; CHECK-NEXT: call void (i8*, i8*, ...) @sprintf(i8* [[DST:%.*]], i8* getelementptr inbounds ([13 x i8], [13 x i8]* @hello_world, i32 0, i32 0))
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
%fmt = getelementptr [13 x i8], [13 x i8]* @hello_world, i32 0, i32 0
|
||||
call void (i8*, i8*, ...) @sprintf(i8* %dst, i8* %fmt)
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue