diff --git a/generator/control-flow_test.go b/generator/control-flow_test.go index 592ba1c..3726326 100644 --- a/generator/control-flow_test.go +++ b/generator/control-flow_test.go @@ -403,7 +403,67 @@ testString (test, func TestFor (test *testing.T) { testString (test, -` +`%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64 +%"AAAAAAAAAAAAAAAAAAAAAA==::String" = type { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } +%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" = type i8 +define void @"0zNZN147MN2wzMAQ6NS2dQ==::f"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str) { +0: + %1 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String" + store %"AAAAAAAAAAAAAAAAAAAAAA==::String" %str, ptr %1 + %2 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::Index" + %3 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::Byte" + br label %4 +4: + %5 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %1, i32 0, i32 1 + %6 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %5 + %7 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %2 + %8 = icmp ult %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %7, %6 + br i1 %8, label %9, label %17 +9: + %10 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %1, i32 0, i32 0 + %11 = load ptr, ptr %10 + %12 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %2 + %13 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::Byte", ptr %11, i32 0, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %12 + store ptr %13, ptr %3 + %14 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Byte", ptr %3 + call void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %14) + %15 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %2 + %16 = add %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %15, 1 + store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %16, ptr %2 + br label %9 +17: + ret void +} +declare void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %x) +define void @"0zNZN147MN2wzMAQ6NS2dQ==::g"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str) { +0: + %1 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String" + store %"AAAAAAAAAAAAAAAAAAAAAA==::String" %str, ptr %1 + %2 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::Index" + store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" zeroinitializer, ptr %2 + %3 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::Byte" + br label %4 +4: + %5 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %1, i32 0, i32 1 + %6 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %5 + %7 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %2 + %8 = icmp ult %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %7, %6 + br i1 %8, label %9, label %17 +9: + %10 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %1, i32 0, i32 0 + %11 = load ptr, ptr %10 + %12 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %2 + %13 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::Byte", ptr %11, i32 0, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %12 + store ptr %13, ptr %3 + %14 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Byte", ptr %3 + call void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %14) + %15 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %2 + %16 = add %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %15, 1 + store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %16, ptr %2 + br label %9 +17: + ret void +} `, ` [print x:Byte] @@ -413,7 +473,37 @@ testString (test, func TestForBreak (test *testing.T) { testString (test, -` +`%"AAAAAAAAAAAAAAAAAAAAAA==::Byte" = type i8 +%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64 +%"AAAAAAAAAAAAAAAAAAAAAA==::String" = type { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } +define %"AAAAAAAAAAAAAAAAAAAAAA==::Byte" @"0zNZN147MN2wzMAQ6NS2dQ==::f"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %str) { +0: + %1 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String" + store %"AAAAAAAAAAAAAAAAAAAAAA==::String" %str, ptr %1 + %2 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::Index" + %3 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::Byte" + br label %4 +4: + %5 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %1, i32 0, i32 1 + %6 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %5 + %7 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %2 + %8 = icmp ult %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %7, %6 + br i1 %8, label %9, label %17 +9: + %10 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %1, i32 0, i32 0 + %11 = load ptr, ptr %10 + %12 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %2 + %13 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::Byte", ptr %11, i32 0, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %12 + store ptr %13, ptr %3 + %14 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Byte", ptr %3 + %15 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %2 + %16 = add %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %15, 1 + store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %16, ptr %2 + br label %17 +17: + %18 = phi %"AAAAAAAAAAAAAAAAAAAAAA==::Byte" [ %14, %9 ], [ zeroinitializer, %4 ] + ret %"AAAAAAAAAAAAAAAAAAAAAA==::Byte" %18 +} `, ` [f str:String]:Byte = for c:Byte in str [break c] diff --git a/generator/misc_test.go b/generator/misc_test.go index b61f45b..3e10549 100644 --- a/generator/misc_test.go +++ b/generator/misc_test.go @@ -141,28 +141,28 @@ define void @"0zNZN147MN2wzMAQ6NS2dQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::Strin %4 = getelementptr { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %1, i32 0, i32 1 %5 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %4 %6 = icmp ult %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %5, 1 - br i1 %6, label %7, label %8 + br i1 %6, label %8, label %9 7: - br label %21 -8: - %9 = getelementptr { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %1, i32 0, i32 0 - %10 = load ptr, ptr %9 - %11 = call %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @write(i32 1, ptr %10, i64 1) - %12 = getelementptr { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %1, i32 0, i32 0 - %13 = load ptr, ptr %12 - %14 = getelementptr { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %1, i32 0, i32 1 - %15 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %14 - %16 = sub %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %15, 1 - %17 = getelementptr i8, ptr %13, i64 1 - %18 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %2, i32 0, i32 0 - store ptr %17, ptr %18 - %19 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %2, i32 0, i32 1 - store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %16, ptr %19 - %20 = load %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %2 - store %"AAAAAAAAAAAAAAAAAAAAAA==::String" %20, ptr %1 - br label %3 -21: ret void +8: + br label %7 +9: + %10 = getelementptr { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %1, i32 0, i32 0 + %11 = load ptr, ptr %10 + %12 = call %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @write(i32 1, ptr %11, i64 1) + %13 = getelementptr { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %1, i32 0, i32 0 + %14 = load ptr, ptr %13 + %15 = getelementptr { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }, ptr %1, i32 0, i32 1 + %16 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %15 + %17 = sub %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %16, 1 + %18 = getelementptr i8, ptr %14, i64 1 + %19 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %2, i32 0, i32 0 + store ptr %18, ptr %19 + %20 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %2, i32 0, i32 1 + store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %17, ptr %20 + %21 = load %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %2 + store %"AAAAAAAAAAAAAAAAAAAAAA==::String" %21, ptr %1 + br label %3 } declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @write(i32 %file, ptr %buffer, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %count) `,