; ModuleID = 'template/grep.ll.c' 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" target triple = "i386-apple-darwin9" %struct.FILE = type { i8*, i32, i32, i16, i16, %struct.__sbuf, i32, i8*, i32 (i8*)*, i32 (i8*, i8*, i32)*, i64 (i8*, i64, i32)*, i32 (i8*, i8*, i32)*, %struct.__sbuf, %struct.__sFILEX*, i32, [3 x i8], [1 x i8], %struct.__sbuf, i32, i64 } %struct.__sFILEX = type opaque %struct.__sbuf = type { i8*, i32 } @"\01LC" = internal constant [4 x i8] c"%s:\00" ; <[4 x i8]*> [#uses=1] @"\01LC1" = internal constant [2 x i8] c"r\00" ; <[2 x i8]*> [#uses=1] @__stderrp = external global %struct.FILE* ; <%struct.FILE**> [#uses=4] @"\01LC2" = internal constant [15 x i8] c"can't open %s:\00" ; <[15 x i8]*> [#uses=1] @readbuf = common global [1048576 x i8] zeroinitializer, align 32 ; <[1048576 x i8]*> [#uses=1] @"\01LC3" = internal constant [30 x i8] c"usage: grep regexp [file ...]\00" ; <[30 x i8]*> [#uses=1] @__stdinp = external global %struct.FILE* ; <%struct.FILE**> [#uses=1] define i32 @match(i8* %regexp, i8* %text) nounwind { entry: %regexp_addr = alloca i8* ; [#uses=2] %text_addr = alloca i8* ; [#uses=6] %retval = alloca i32 ; [#uses=2] alloca i32 ; :0 [#uses=4] %"alloca point" = bitcast i32 0 to i32 ; [#uses=0] store i8* %regexp, i8** %regexp_addr store i8* %text, i8** %text_addr load i8** %regexp_addr, align 4 ; :1 [#uses=1] getelementptr i8* %1, i32 0 ; :2 [#uses=1] load i8* %2, align 1 ; :3 [#uses=1] icmp eq i8 %3, 94 ; :4 [#uses=1] zext i1 %4 to i8 ; :5 [#uses=1] %toBool = icmp ne i8 %5, 0 ; [#uses=1] br i1 %toBool, label %bb, label %bb1 bb: ; preds = %entry load i8** %text_addr, align 4 ; :6 [#uses=1] call i32 @DFA( i8* %6 ) nounwind ; :7 [#uses=1] store i32 %7, i32* %0, align 4 br label %bb7 bb1: ; preds = %bb4, %entry load i8** %text_addr, align 4 ; :8 [#uses=1] call i32 @DFA( i8* %8 ) nounwind ; :9 [#uses=1] icmp ne i32 %9, 0 ; :10 [#uses=1] zext i1 %10 to i8 ; :11 [#uses=1] %toBool2 = icmp ne i8 %11, 0 ; [#uses=1] br i1 %toBool2, label %bb3, label %bb4 bb3: ; preds = %bb1 store i32 1, i32* %0, align 4 br label %bb7 bb4: ; preds = %bb1 load i8** %text_addr, align 4 ; :12 [#uses=1] load i8* %12, align 1 ; :13 [#uses=1] icmp ne i8 %13, 0 ; :14 [#uses=1] zext i1 %14 to i8 ; :15 [#uses=1] load i8** %text_addr, align 4 ; :16 [#uses=1] getelementptr i8* %16, i64 1 ; :17 [#uses=1] store i8* %17, i8** %text_addr, align 4 %toBool5 = icmp ne i8 %15, 0 ; [#uses=1] br i1 %toBool5, label %bb1, label %bb6 bb6: ; preds = %bb4 store i32 0, i32* %0, align 4 br label %bb7 bb7: ; preds = %bb6, %bb3, %bb load i32* %0, align 4 ; :18 [#uses=1] store i32 %18, i32* %retval, align 4 br label %return return: ; preds = %bb7 %retval8 = load i32* %retval ; [#uses=1] ret i32 %retval8 } declare i32 @DFA(i8*) define void @grep(i8* %regexp, %struct.FILE* %f, i8* %name) nounwind { entry: %regexp_addr = alloca i8* ; [#uses=2] %f_addr = alloca %struct.FILE* ; <%struct.FILE**> [#uses=2] %name_addr = alloca i8* ; [#uses=3] %buf = alloca [1024 x i8] ; <[1024 x i8]*> [#uses=6] %n = alloca i32 ; [#uses=4] %"alloca point" = bitcast i32 0 to i32 ; [#uses=0] store i8* %regexp, i8** %regexp_addr store %struct.FILE* %f, %struct.FILE** %f_addr store i8* %name, i8** %name_addr br label %bb13 bb: ; preds = %bb13 %buf1 = bitcast [1024 x i8]* %buf to i8* ; [#uses=1] call i32 @strlen( i8* %buf1 ) nounwind readonly ; :0 [#uses=1] store i32 %0, i32* %n, align 4 load i32* %n, align 4 ; :1 [#uses=1] icmp sgt i32 %1, 0 ; :2 [#uses=1] zext i1 %2 to i8 ; :3 [#uses=1] %toBool = icmp ne i8 %3, 0 ; [#uses=1] br i1 %toBool, label %bb2, label %bb5 bb2: ; preds = %bb load i32* %n, align 4 ; :4 [#uses=1] sub i32 %4, 1 ; :5 [#uses=1] getelementptr [1024 x i8]* %buf, i32 0, i32 %5 ; :6 [#uses=1] load i8* %6, align 1 ; :7 [#uses=1] icmp eq i8 %7, 10 ; :8 [#uses=1] zext i1 %8 to i8 ; :9 [#uses=1] %toBool3 = icmp ne i8 %9, 0 ; [#uses=1] br i1 %toBool3, label %bb4, label %bb5 bb4: ; preds = %bb2 load i32* %n, align 4 ; :10 [#uses=1] sub i32 %10, 1 ; :11 [#uses=1] getelementptr [1024 x i8]* %buf, i32 0, i32 %11 ; :12 [#uses=1] store i8 0, i8* %12, align 1 br label %bb5 bb5: ; preds = %bb4, %bb2, %bb load i8** %regexp_addr, align 4 ; :13 [#uses=1] %buf6 = bitcast [1024 x i8]* %buf to i8* ; [#uses=1] call i32 @match( i8* %13, i8* %buf6 ) nounwind ; :14 [#uses=1] icmp ne i32 %14, 0 ; :15 [#uses=1] zext i1 %15 to i8 ; :16 [#uses=1] %toBool7 = icmp ne i8 %16, 0 ; [#uses=1] br i1 %toBool7, label %bb8, label %bb13 bb8: ; preds = %bb5 load i8** %name_addr, align 4 ; :17 [#uses=1] icmp ne i8* %17, null ; :18 [#uses=1] zext i1 %18 to i8 ; :19 [#uses=1] %toBool9 = icmp ne i8 %19, 0 ; [#uses=1] br i1 %toBool9, label %bb10, label %bb11 bb10: ; preds = %bb8 load i8** %name_addr, align 4 ; :20 [#uses=1] call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @"\01LC", i32 0, i32 0), i8* %20 ) nounwind ; :21 [#uses=0] br label %bb11 bb11: ; preds = %bb10, %bb8 %buf12 = bitcast [1024 x i8]* %buf to i8* ; [#uses=1] call i32 @puts( i8* %buf12 ) nounwind ; :22 [#uses=0] br label %bb13 bb13: ; preds = %bb11, %bb5, %entry %buf14 = bitcast [1024 x i8]* %buf to i8* ; [#uses=1] load %struct.FILE** %f_addr, align 4 ; <%struct.FILE*>:23 [#uses=1] call i8* @fgets( i8* %buf14, i32 1024, %struct.FILE* %23 ) nounwind ; :24 [#uses=1] icmp ne i8* %24, null ; :25 [#uses=1] zext i1 %25 to i8 ; :26 [#uses=1] %toBool15 = icmp ne i8 %26, 0 ; [#uses=1] br i1 %toBool15, label %bb, label %bb16 bb16: ; preds = %bb13 br label %return return: ; preds = %bb16 ret void } declare i32 @strlen(i8*) nounwind readonly declare i32 @printf(i8*, ...) nounwind declare i32 @puts(i8*) declare i8* @fgets(i8*, i32, %struct.FILE*) define void @llgrep(i8* %regexp, i8* %filename) nounwind { entry: %regexp_addr = alloca i8* ; [#uses=2] %filename_addr = alloca i8* ; [#uses=3] %f = alloca %struct.FILE* ; <%struct.FILE**> [#uses=5] %"alloca point" = bitcast i32 0 to i32 ; [#uses=0] store i8* %regexp, i8** %regexp_addr store i8* %filename, i8** %filename_addr load i8** %filename_addr, align 4 ; :0 [#uses=1] call %struct.FILE* @fopen( i8* %0, i8* getelementptr ([2 x i8]* @"\01LC1", i32 0, i32 0) ) nounwind ; <%struct.FILE*>:1 [#uses=1] store %struct.FILE* %1, %struct.FILE** %f, align 4 load %struct.FILE** %f, align 4 ; <%struct.FILE*>:2 [#uses=1] icmp eq %struct.FILE* %2, null ; :3 [#uses=1] zext i1 %3 to i8 ; :4 [#uses=1] %toBool = icmp ne i8 %4, 0 ; [#uses=1] br i1 %toBool, label %bb, label %bb1 bb: ; preds = %entry load %struct.FILE** @__stderrp, align 4 ; <%struct.FILE*>:5 [#uses=1] load i8** %filename_addr, align 4 ; :6 [#uses=1] call i32 (%struct.FILE*, i8*, ...)* @fprintf( %struct.FILE* %5, i8* getelementptr ([15 x i8]* @"\01LC2", i32 0, i32 0), i8* %6 ) nounwind ; :7 [#uses=0] br label %bb1 bb1: ; preds = %bb, %entry load %struct.FILE** %f, align 4 ; <%struct.FILE*>:8 [#uses=1] call i32 @setvbuf( %struct.FILE* %8, i8* getelementptr ([1048576 x i8]* @readbuf, i32 0, i32 0), i32 0, i32 1048576 ) nounwind ; :9 [#uses=0] load i8** %regexp_addr, align 4 ; :10 [#uses=1] load %struct.FILE** %f, align 4 ; <%struct.FILE*>:11 [#uses=1] call void @grep( i8* %10, %struct.FILE* %11, i8* null ) nounwind load %struct.FILE** %f, align 4 ; <%struct.FILE*>:12 [#uses=1] call i32 @fclose( %struct.FILE* %12 ) nounwind ; :13 [#uses=0] br label %return return: ; preds = %bb1 ret void } declare %struct.FILE* @fopen(i8*, i8*) declare i32 @fprintf(%struct.FILE*, i8*, ...) nounwind declare i32 @setvbuf(%struct.FILE*, i8*, i32, i32) declare i32 @fclose(%struct.FILE*) define void @llgrep_with_name(i8* %regexp, i8* %filename) nounwind { entry: %regexp_addr = alloca i8* ; [#uses=2] %filename_addr = alloca i8* ; [#uses=4] %f = alloca %struct.FILE* ; <%struct.FILE**> [#uses=5] %nmatch = alloca i32 ; [#uses=1] %"alloca point" = bitcast i32 0 to i32 ; [#uses=0] store i8* %regexp, i8** %regexp_addr store i8* %filename, i8** %filename_addr store i32 0, i32* %nmatch, align 4 load i8** %filename_addr, align 4 ; :0 [#uses=1] call %struct.FILE* @fopen( i8* %0, i8* getelementptr ([2 x i8]* @"\01LC1", i32 0, i32 0) ) nounwind ; <%struct.FILE*>:1 [#uses=1] store %struct.FILE* %1, %struct.FILE** %f, align 4 load %struct.FILE** %f, align 4 ; <%struct.FILE*>:2 [#uses=1] icmp eq %struct.FILE* %2, null ; :3 [#uses=1] zext i1 %3 to i8 ; :4 [#uses=1] %toBool = icmp ne i8 %4, 0 ; [#uses=1] br i1 %toBool, label %bb, label %bb1 bb: ; preds = %entry load %struct.FILE** @__stderrp, align 4 ; <%struct.FILE*>:5 [#uses=1] load i8** %filename_addr, align 4 ; :6 [#uses=1] call i32 (%struct.FILE*, i8*, ...)* @fprintf( %struct.FILE* %5, i8* getelementptr ([15 x i8]* @"\01LC2", i32 0, i32 0), i8* %6 ) nounwind ; :7 [#uses=0] br label %bb1 bb1: ; preds = %bb, %entry load %struct.FILE** %f, align 4 ; <%struct.FILE*>:8 [#uses=1] call i32 @setvbuf( %struct.FILE* %8, i8* getelementptr ([1048576 x i8]* @readbuf, i32 0, i32 0), i32 0, i32 1048576 ) nounwind ; :9 [#uses=0] load i8** %regexp_addr, align 4 ; :10 [#uses=1] load %struct.FILE** %f, align 4 ; <%struct.FILE*>:11 [#uses=1] load i8** %filename_addr, align 4 ; :12 [#uses=1] call void @grep( i8* %10, %struct.FILE* %11, i8* %12 ) nounwind load %struct.FILE** %f, align 4 ; <%struct.FILE*>:13 [#uses=1] call i32 @fclose( %struct.FILE* %13 ) nounwind ; :14 [#uses=0] br label %return return: ; preds = %bb1 ret void } define i32 @main(i32 %argc, i8** %argv) nounwind { entry: %argc_addr = alloca i32 ; [#uses=5] %argv_addr = alloca i8** ; [#uses=6] %retval = alloca i32 ; [#uses=2] %f = alloca %struct.FILE* ; <%struct.FILE**> [#uses=5] %i = alloca i32 ; [#uses=7] alloca i32 ; :0 [#uses=2] %iftmp.5 = alloca i8* ; [#uses=3] %"alloca point" = bitcast i32 0 to i32 ; [#uses=0] store i32 %argc, i32* %argc_addr store i8** %argv, i8*** %argv_addr load i32* %argc_addr, align 4 ; :1 [#uses=1] icmp sle i32 %1, 1 ; :2 [#uses=1] zext i1 %2 to i8 ; :3 [#uses=1] %toBool = icmp ne i8 %3, 0 ; [#uses=1] br i1 %toBool, label %bb, label %bb1 bb: ; preds = %entry load %struct.FILE** @__stderrp, align 4 ; <%struct.FILE*>:4 [#uses=1] bitcast %struct.FILE* %4 to i8* ; :5 [#uses=1] call i32 @"\01_fwrite$UNIX2003"( i8* getelementptr ([30 x i8]* @"\01LC3", i32 0, i32 0), i32 1, i32 29, i8* %5 ) nounwind ; :6 [#uses=0] call void @exit( i32 0 ) noreturn nounwind unreachable bb1: ; preds = %entry load i32* %argc_addr, align 4 ; :7 [#uses=1] icmp eq i32 %7, 2 ; :8 [#uses=1] zext i1 %8 to i8 ; :9 [#uses=1] %toBool2 = icmp ne i8 %9, 0 ; [#uses=1] br i1 %toBool2, label %bb3, label %bb4 bb3: ; preds = %bb1 load %struct.FILE** @__stdinp, align 4 ; <%struct.FILE*>:10 [#uses=1] load i8*** %argv_addr, align 4 ; :11 [#uses=1] getelementptr i8** %11, i32 1 ; :12 [#uses=1] load i8** %12, align 4 ; :13 [#uses=1] call void @grep( i8* %13, %struct.FILE* %10, i8* null ) nounwind br label %bb16 bb4: ; preds = %bb1 store i32 2, i32* %i, align 4 br label %bb14 bb5: ; preds = %bb14 load i8*** %argv_addr, align 4 ; :14 [#uses=1] load i32* %i, align 4 ; :15 [#uses=1] getelementptr i8** %14, i32 %15 ; :16 [#uses=1] load i8** %16, align 4 ; :17 [#uses=1] call %struct.FILE* @fopen( i8* %17, i8* getelementptr ([2 x i8]* @"\01LC1", i32 0, i32 0) ) nounwind ; <%struct.FILE*>:18 [#uses=1] store %struct.FILE* %18, %struct.FILE** %f, align 4 load %struct.FILE** %f, align 4 ; <%struct.FILE*>:19 [#uses=1] icmp eq %struct.FILE* %19, null ; :20 [#uses=1] zext i1 %20 to i8 ; :21 [#uses=1] %toBool6 = icmp ne i8 %21, 0 ; [#uses=1] br i1 %toBool6, label %bb7, label %bb8 bb7: ; preds = %bb5 load i8*** %argv_addr, align 4 ; :22 [#uses=1] load i32* %i, align 4 ; :23 [#uses=1] getelementptr i8** %22, i32 %23 ; :24 [#uses=1] load i8** %24, align 4 ; :25 [#uses=1] load %struct.FILE** @__stderrp, align 4 ; <%struct.FILE*>:26 [#uses=1] call i32 (%struct.FILE*, i8*, ...)* @fprintf( %struct.FILE* %26, i8* getelementptr ([15 x i8]* @"\01LC2", i32 0, i32 0), i8* %25 ) nounwind ; :27 [#uses=0] br label %bb13 bb8: ; preds = %bb5 load %struct.FILE** %f, align 4 ; <%struct.FILE*>:28 [#uses=1] call i32 @setvbuf( %struct.FILE* %28, i8* getelementptr ([1048576 x i8]* @readbuf, i32 0, i32 0), i32 0, i32 1048576 ) nounwind ; :29 [#uses=0] load i32* %argc_addr, align 4 ; :30 [#uses=1] icmp sgt i32 %30, 3 ; :31 [#uses=1] zext i1 %31 to i8 ; :32 [#uses=1] %toBool9 = icmp ne i8 %32, 0 ; [#uses=1] br i1 %toBool9, label %bb10, label %bb11 bb10: ; preds = %bb8 load i8*** %argv_addr, align 4 ; :33 [#uses=1] load i32* %i, align 4 ; :34 [#uses=1] getelementptr i8** %33, i32 %34 ; :35 [#uses=1] load i8** %35, align 4 ; :36 [#uses=1] store i8* %36, i8** %iftmp.5, align 4 br label %bb12 bb11: ; preds = %bb8 store i8* null, i8** %iftmp.5, align 4 br label %bb12 bb12: ; preds = %bb11, %bb10 load i8*** %argv_addr, align 4 ; :37 [#uses=1] getelementptr i8** %37, i32 1 ; :38 [#uses=1] load i8** %38, align 4 ; :39 [#uses=1] load %struct.FILE** %f, align 4 ; <%struct.FILE*>:40 [#uses=1] load i8** %iftmp.5, align 4 ; :41 [#uses=1] call void @grep( i8* %39, %struct.FILE* %40, i8* %41 ) nounwind load %struct.FILE** %f, align 4 ; <%struct.FILE*>:42 [#uses=1] call i32 @fclose( %struct.FILE* %42 ) nounwind ; :43 [#uses=0] br label %bb13 bb13: ; preds = %bb12, %bb7 load i32* %i, align 4 ; :44 [#uses=1] add i32 %44, 1 ; :45 [#uses=1] store i32 %45, i32* %i, align 4 br label %bb14 bb14: ; preds = %bb13, %bb4 load i32* %i, align 4 ; :46 [#uses=1] load i32* %argc_addr, align 4 ; :47 [#uses=1] icmp slt i32 %46, %47 ; :48 [#uses=1] zext i1 %48 to i8 ; :49 [#uses=1] %toBool15 = icmp ne i8 %49, 0 ; [#uses=1] br i1 %toBool15, label %bb5, label %bb16 bb16: ; preds = %bb14, %bb3 store i32 0, i32* %0, align 4 load i32* %0, align 4 ; :50 [#uses=1] store i32 %50, i32* %retval, align 4 br label %return return: ; preds = %bb16 %retval17 = load i32* %retval ; [#uses=1] ret i32 %retval17 } declare i32 @"\01_fwrite$UNIX2003"(i8*, i32, i32, i8*) declare void @exit(i32) noreturn nounwind