For loops loop back around to the loop header

This commit is contained in:
Sasha Koshka
2024-03-24 03:35:04 -04:00
parent 005baa2ab6
commit 0cf1b052c1
3 changed files with 69 additions and 3 deletions

View File

@@ -1,10 +1,10 @@
[main]:I32 'main' = {
; array
arr:5:String = (* 'a' 'b' 'c')
arr:3:String = (* 'a' 'b' 'c')
for e:String in arr io::[println e]
; slice
;slice:*:String = arr
;for e:String in slice io::[println e]
;0
0
}

View File

@@ -0,0 +1,66 @@
%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64
%"AAAAAAAAAAAAAAAAAAAAAA==::String" = type { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" }
%"+VqqFGEsRc2zrv0kBJzIGw==::FileDescriptor" = type i64
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"Qxtg3cmQQIauMKrWJGsgfQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %string)
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"Qxtg3cmQQIauMKrWJGsgfQ==::println"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %string)
define i32 @main() {
0:
%1 = alloca [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::String"]
%2 = getelementptr [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::String"], ptr %1, i32 0, i32 0
%3 = alloca [1 x i8]
%4 = getelementptr [1 x i8], ptr %3, i32 0, i32 0
store i8 97, ptr %4
%5 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %2, i32 0, i32 0
store ptr %3, ptr %5
%6 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %2, i32 0, i32 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 1, ptr %6
%7 = getelementptr [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::String"], ptr %1, i32 0, i32 1
%8 = alloca [1 x i8]
%9 = getelementptr [1 x i8], ptr %8, i32 0, i32 0
store i8 98, ptr %9
%10 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %7, i32 0, i32 0
store ptr %8, ptr %10
%11 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %7, i32 0, i32 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 1, ptr %11
%12 = getelementptr [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::String"], ptr %1, i32 0, i32 2
%13 = alloca [1 x i8]
%14 = getelementptr [1 x i8], ptr %13, i32 0, i32 0
store i8 99, ptr %14
%15 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %12, i32 0, i32 0
store ptr %13, ptr %15
%16 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %12, i32 0, i32 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 1, ptr %16
%17 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::Index"
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" zeroinitializer, ptr %17
%18 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String"
%19 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String"
%20 = alloca [1 x i8]
br label %21
21:
%22 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %17
%23 = icmp ult %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %22, 3
br i1 %23, label %24, label %35
24:
%25 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %17
%26 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %1, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %25
%27 = load %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %26
store %"AAAAAAAAAAAAAAAAAAAAAA==::String" %27, ptr %18
%28 = getelementptr [1 x i8], ptr %20, i32 0, i32 0
store i8 105, ptr %28
%29 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %19, i32 0, i32 0
store ptr %20, ptr %29
%30 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %19, i32 0, i32 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 1, ptr %30
%31 = load %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %19
%32 = call %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"Qxtg3cmQQIauMKrWJGsgfQ==::println"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %31)
%33 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %17
%34 = add %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %33, 1
store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %34, ptr %17
br label %24
35:
ret i32 0
}
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @puts(ptr %string)
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @read(%"+VqqFGEsRc2zrv0kBJzIGw==::FileDescriptor" %file, ptr %buffer, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %count)
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @write(%"+VqqFGEsRc2zrv0kBJzIGw==::FileDescriptor" %file, ptr %buffer, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %count)
declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"Qxtg3cmQQIauMKrWJGsgfQ==::File.write"(ptr %this, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %buffer)

View File

@@ -322,7 +322,7 @@ func (this *generator) generateFor (loop *entity.For, mode resultMode) (llvm.Val
// loop back around
if !final.Terminated () {
final.NewBr(body)
final.NewBr(header)
}
return irValue, loopEntry.loc, nil
}