1*9880d681SAndroid Build Coastguard Worker; Test that the fwrite library call simplifier works correctly. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workertarget 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" 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker%FILE = type { } 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker@str = constant [1 x i8] zeroinitializer 10*9880d681SAndroid Build Coastguard Worker@empty = constant [0 x i8] zeroinitializer 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdeclare i64 @fwrite(i8*, i64, i64, %FILE *) 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; Check fwrite(S, 1, 1, fp) -> fputc(S[0], fp). 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerdefine void @test_simplify1(%FILE* %fp) { 17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify1( 18*9880d681SAndroid Build Coastguard Worker %str = getelementptr inbounds [1 x i8], [1 x i8]* @str, i64 0, i64 0 19*9880d681SAndroid Build Coastguard Worker call i64 @fwrite(i8* %str, i64 1, i64 1, %FILE* %fp) 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call i32 @fputc(i32 0, %FILE* %fp) 21*9880d681SAndroid Build Coastguard Worker ret void 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine void @test_simplify2(%FILE* %fp) { 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify2( 27*9880d681SAndroid Build Coastguard Worker %str = getelementptr inbounds [0 x i8], [0 x i8]* @empty, i64 0, i64 0 28*9880d681SAndroid Build Coastguard Worker call i64 @fwrite(i8* %str, i64 1, i64 0, %FILE* %fp) 29*9880d681SAndroid Build Coastguard Worker ret void 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine void @test_simplify3(%FILE* %fp) { 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify3( 35*9880d681SAndroid Build Coastguard Worker %str = getelementptr inbounds [0 x i8], [0 x i8]* @empty, i64 0, i64 0 36*9880d681SAndroid Build Coastguard Worker call i64 @fwrite(i8* %str, i64 0, i64 1, %FILE* %fp) 37*9880d681SAndroid Build Coastguard Worker ret void 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine i64 @test_no_simplify1(%FILE* %fp) { 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_no_simplify1( 43*9880d681SAndroid Build Coastguard Worker %str = getelementptr inbounds [1 x i8], [1 x i8]* @str, i64 0, i64 0 44*9880d681SAndroid Build Coastguard Worker %ret = call i64 @fwrite(i8* %str, i64 1, i64 1, %FILE* %fp) 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call i64 @fwrite 46*9880d681SAndroid Build Coastguard Worker ret i64 %ret 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %ret 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine void @test_no_simplify2(%FILE* %fp, i64 %size) { 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_no_simplify2( 52*9880d681SAndroid Build Coastguard Worker %str = getelementptr inbounds [1 x i8], [1 x i8]* @str, i64 0, i64 0 53*9880d681SAndroid Build Coastguard Worker call i64 @fwrite(i8* %str, i64 %size, i64 1, %FILE* %fp) 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call i64 @fwrite 55*9880d681SAndroid Build Coastguard Worker ret void 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void 57*9880d681SAndroid Build Coastguard Worker} 58