Mercurial > hg > Members > shinya > pyrect
view pyrect/translator/template/grep.ll @ 47:701beabd7d97
add input-rules, Range, CharacterClass, Anchor and MultiByte-Char(but not work)\nand more simplify NFA (is global improvement).
author | Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 08 Aug 2010 04:13:14 +0900 |
parents | pyrect/template/grep.ll@71fa409932bd |
children |
line wrap: on
line source
; 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* ; <i8**> [#uses=2] %text_addr = alloca i8* ; <i8**> [#uses=6] %retval = alloca i32 ; <i32*> [#uses=2] alloca i32 ; <i32*>:0 [#uses=4] %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] store i8* %regexp, i8** %regexp_addr store i8* %text, i8** %text_addr load i8** %regexp_addr, align 4 ; <i8*>:1 [#uses=1] getelementptr i8* %1, i32 0 ; <i8*>:2 [#uses=1] load i8* %2, align 1 ; <i8>:3 [#uses=1] icmp eq i8 %3, 94 ; <i1>:4 [#uses=1] zext i1 %4 to i8 ; <i8>:5 [#uses=1] %toBool = icmp ne i8 %5, 0 ; <i1> [#uses=1] br i1 %toBool, label %bb, label %bb1 bb: ; preds = %entry load i8** %text_addr, align 4 ; <i8*>:6 [#uses=1] call i32 @DFA( i8* %6 ) nounwind ; <i32>:7 [#uses=1] store i32 %7, i32* %0, align 4 br label %bb7 bb1: ; preds = %bb4, %entry load i8** %text_addr, align 4 ; <i8*>:8 [#uses=1] call i32 @DFA( i8* %8 ) nounwind ; <i32>:9 [#uses=1] icmp ne i32 %9, 0 ; <i1>:10 [#uses=1] zext i1 %10 to i8 ; <i8>:11 [#uses=1] %toBool2 = icmp ne i8 %11, 0 ; <i1> [#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 ; <i8*>:12 [#uses=1] load i8* %12, align 1 ; <i8>:13 [#uses=1] icmp ne i8 %13, 0 ; <i1>:14 [#uses=1] zext i1 %14 to i8 ; <i8>:15 [#uses=1] load i8** %text_addr, align 4 ; <i8*>:16 [#uses=1] getelementptr i8* %16, i64 1 ; <i8*>:17 [#uses=1] store i8* %17, i8** %text_addr, align 4 %toBool5 = icmp ne i8 %15, 0 ; <i1> [#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 ; <i32>:18 [#uses=1] store i32 %18, i32* %retval, align 4 br label %return return: ; preds = %bb7 %retval8 = load i32* %retval ; <i32> [#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* ; <i8**> [#uses=2] %f_addr = alloca %struct.FILE* ; <%struct.FILE**> [#uses=2] %name_addr = alloca i8* ; <i8**> [#uses=3] %buf = alloca [1024 x i8] ; <[1024 x i8]*> [#uses=6] %n = alloca i32 ; <i32*> [#uses=4] %"alloca point" = bitcast i32 0 to i32 ; <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* ; <i8*> [#uses=1] call i32 @strlen( i8* %buf1 ) nounwind readonly ; <i32>:0 [#uses=1] store i32 %0, i32* %n, align 4 load i32* %n, align 4 ; <i32>:1 [#uses=1] icmp sgt i32 %1, 0 ; <i1>:2 [#uses=1] zext i1 %2 to i8 ; <i8>:3 [#uses=1] %toBool = icmp ne i8 %3, 0 ; <i1> [#uses=1] br i1 %toBool, label %bb2, label %bb5 bb2: ; preds = %bb load i32* %n, align 4 ; <i32>:4 [#uses=1] sub i32 %4, 1 ; <i32>:5 [#uses=1] getelementptr [1024 x i8]* %buf, i32 0, i32 %5 ; <i8*>:6 [#uses=1] load i8* %6, align 1 ; <i8>:7 [#uses=1] icmp eq i8 %7, 10 ; <i1>:8 [#uses=1] zext i1 %8 to i8 ; <i8>:9 [#uses=1] %toBool3 = icmp ne i8 %9, 0 ; <i1> [#uses=1] br i1 %toBool3, label %bb4, label %bb5 bb4: ; preds = %bb2 load i32* %n, align 4 ; <i32>:10 [#uses=1] sub i32 %10, 1 ; <i32>:11 [#uses=1] getelementptr [1024 x i8]* %buf, i32 0, i32 %11 ; <i8*>:12 [#uses=1] store i8 0, i8* %12, align 1 br label %bb5 bb5: ; preds = %bb4, %bb2, %bb load i8** %regexp_addr, align 4 ; <i8*>:13 [#uses=1] %buf6 = bitcast [1024 x i8]* %buf to i8* ; <i8*> [#uses=1] call i32 @match( i8* %13, i8* %buf6 ) nounwind ; <i32>:14 [#uses=1] icmp ne i32 %14, 0 ; <i1>:15 [#uses=1] zext i1 %15 to i8 ; <i8>:16 [#uses=1] %toBool7 = icmp ne i8 %16, 0 ; <i1> [#uses=1] br i1 %toBool7, label %bb8, label %bb13 bb8: ; preds = %bb5 load i8** %name_addr, align 4 ; <i8*>:17 [#uses=1] icmp ne i8* %17, null ; <i1>:18 [#uses=1] zext i1 %18 to i8 ; <i8>:19 [#uses=1] %toBool9 = icmp ne i8 %19, 0 ; <i1> [#uses=1] br i1 %toBool9, label %bb10, label %bb11 bb10: ; preds = %bb8 load i8** %name_addr, align 4 ; <i8*>:20 [#uses=1] call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @"\01LC", i32 0, i32 0), i8* %20 ) nounwind ; <i32>:21 [#uses=0] br label %bb11 bb11: ; preds = %bb10, %bb8 %buf12 = bitcast [1024 x i8]* %buf to i8* ; <i8*> [#uses=1] call i32 @puts( i8* %buf12 ) nounwind ; <i32>:22 [#uses=0] br label %bb13 bb13: ; preds = %bb11, %bb5, %entry %buf14 = bitcast [1024 x i8]* %buf to i8* ; <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 ; <i8*>:24 [#uses=1] icmp ne i8* %24, null ; <i1>:25 [#uses=1] zext i1 %25 to i8 ; <i8>:26 [#uses=1] %toBool15 = icmp ne i8 %26, 0 ; <i1> [#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* ; <i8**> [#uses=2] %filename_addr = alloca i8* ; <i8**> [#uses=3] %f = alloca %struct.FILE* ; <%struct.FILE**> [#uses=5] %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] store i8* %regexp, i8** %regexp_addr store i8* %filename, i8** %filename_addr load i8** %filename_addr, align 4 ; <i8*>: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 ; <i1>:3 [#uses=1] zext i1 %3 to i8 ; <i8>:4 [#uses=1] %toBool = icmp ne i8 %4, 0 ; <i1> [#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 ; <i8*>: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 ; <i32>: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 ; <i32>:9 [#uses=0] load i8** %regexp_addr, align 4 ; <i8*>: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 ; <i32>: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* ; <i8**> [#uses=2] %filename_addr = alloca i8* ; <i8**> [#uses=4] %f = alloca %struct.FILE* ; <%struct.FILE**> [#uses=5] %nmatch = alloca i32 ; <i32*> [#uses=1] %"alloca point" = bitcast i32 0 to i32 ; <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 ; <i8*>: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 ; <i1>:3 [#uses=1] zext i1 %3 to i8 ; <i8>:4 [#uses=1] %toBool = icmp ne i8 %4, 0 ; <i1> [#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 ; <i8*>: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 ; <i32>: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 ; <i32>:9 [#uses=0] load i8** %regexp_addr, align 4 ; <i8*>:10 [#uses=1] load %struct.FILE** %f, align 4 ; <%struct.FILE*>:11 [#uses=1] load i8** %filename_addr, align 4 ; <i8*>: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 ; <i32>:14 [#uses=0] br label %return return: ; preds = %bb1 ret void } define i32 @main(i32 %argc, i8** %argv) nounwind { entry: %argc_addr = alloca i32 ; <i32*> [#uses=5] %argv_addr = alloca i8** ; <i8***> [#uses=6] %retval = alloca i32 ; <i32*> [#uses=2] %f = alloca %struct.FILE* ; <%struct.FILE**> [#uses=5] %i = alloca i32 ; <i32*> [#uses=7] alloca i32 ; <i32*>:0 [#uses=2] %iftmp.5 = alloca i8* ; <i8**> [#uses=3] %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] store i32 %argc, i32* %argc_addr store i8** %argv, i8*** %argv_addr load i32* %argc_addr, align 4 ; <i32>:1 [#uses=1] icmp sle i32 %1, 1 ; <i1>:2 [#uses=1] zext i1 %2 to i8 ; <i8>:3 [#uses=1] %toBool = icmp ne i8 %3, 0 ; <i1> [#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* ; <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 ; <i32>:6 [#uses=0] call void @exit( i32 0 ) noreturn nounwind unreachable bb1: ; preds = %entry load i32* %argc_addr, align 4 ; <i32>:7 [#uses=1] icmp eq i32 %7, 2 ; <i1>:8 [#uses=1] zext i1 %8 to i8 ; <i8>:9 [#uses=1] %toBool2 = icmp ne i8 %9, 0 ; <i1> [#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 ; <i8**>:11 [#uses=1] getelementptr i8** %11, i32 1 ; <i8**>:12 [#uses=1] load i8** %12, align 4 ; <i8*>: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 ; <i8**>:14 [#uses=1] load i32* %i, align 4 ; <i32>:15 [#uses=1] getelementptr i8** %14, i32 %15 ; <i8**>:16 [#uses=1] load i8** %16, align 4 ; <i8*>: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 ; <i1>:20 [#uses=1] zext i1 %20 to i8 ; <i8>:21 [#uses=1] %toBool6 = icmp ne i8 %21, 0 ; <i1> [#uses=1] br i1 %toBool6, label %bb7, label %bb8 bb7: ; preds = %bb5 load i8*** %argv_addr, align 4 ; <i8**>:22 [#uses=1] load i32* %i, align 4 ; <i32>:23 [#uses=1] getelementptr i8** %22, i32 %23 ; <i8**>:24 [#uses=1] load i8** %24, align 4 ; <i8*>: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 ; <i32>: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 ; <i32>:29 [#uses=0] load i32* %argc_addr, align 4 ; <i32>:30 [#uses=1] icmp sgt i32 %30, 3 ; <i1>:31 [#uses=1] zext i1 %31 to i8 ; <i8>:32 [#uses=1] %toBool9 = icmp ne i8 %32, 0 ; <i1> [#uses=1] br i1 %toBool9, label %bb10, label %bb11 bb10: ; preds = %bb8 load i8*** %argv_addr, align 4 ; <i8**>:33 [#uses=1] load i32* %i, align 4 ; <i32>:34 [#uses=1] getelementptr i8** %33, i32 %34 ; <i8**>:35 [#uses=1] load i8** %35, align 4 ; <i8*>: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 ; <i8**>:37 [#uses=1] getelementptr i8** %37, i32 1 ; <i8**>:38 [#uses=1] load i8** %38, align 4 ; <i8*>:39 [#uses=1] load %struct.FILE** %f, align 4 ; <%struct.FILE*>:40 [#uses=1] load i8** %iftmp.5, align 4 ; <i8*>: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 ; <i32>:43 [#uses=0] br label %bb13 bb13: ; preds = %bb12, %bb7 load i32* %i, align 4 ; <i32>:44 [#uses=1] add i32 %44, 1 ; <i32>:45 [#uses=1] store i32 %45, i32* %i, align 4 br label %bb14 bb14: ; preds = %bb13, %bb4 load i32* %i, align 4 ; <i32>:46 [#uses=1] load i32* %argc_addr, align 4 ; <i32>:47 [#uses=1] icmp slt i32 %46, %47 ; <i1>:48 [#uses=1] zext i1 %48 to i8 ; <i8>:49 [#uses=1] %toBool15 = icmp ne i8 %49, 0 ; <i1> [#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 ; <i32>:50 [#uses=1] store i32 %50, i32* %retval, align 4 br label %return return: ; preds = %bb16 %retval17 = load i32* %retval ; <i32> [#uses=1] ret i32 %retval17 } declare i32 @"\01_fwrite$UNIX2003"(i8*, i32, i32, i8*) declare void @exit(i32) noreturn nounwind