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