Created
October 27, 2016 07:24
-
-
Save andrewrk/1bb6d8343ad3a5941a3229469fc07445 to your computer and use it in GitHub Desktop.
more Zig IR progress
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
=============== zig code ===================== | |
extern fn something(); | |
export fn doSomethingTenTimes(x: i32) { | |
{var i: i32 = 0; while (i < 10; i += 1) { | |
if (i == 4) i += x; | |
something(); | |
}} | |
} | |
=============== IR generation ===================== | |
fn doSomethingTenTimes { | |
Entry_0: | |
#1 | type | 1 | i32 | |
#2 | (integer literal)| 1 | 0 | |
#3 | void | - | var i: i32 = 0 | |
#8 | unreachable | - | goto $WhileCond_4 | |
WhileCond_4: | |
#16 | (unknown) | 1 | &i | |
#17 | (unknown) | 1 | *#16 | |
#18 | (integer literal)| 1 | 10 | |
#19 | (unknown) | 1 | #17 < 10 | |
#20 | unreachable | - | if (#19) $WhileBody_5 else $WhileEnd_7 | |
WhileBody_5: | |
#21 | (unknown) | 1 | &i | |
#22 | (unknown) | 1 | *#21 | |
#23 | (integer literal)| 1 | 4 | |
#24 | (unknown) | 1 | #22 == 4 | |
#28 | unreachable | - | if (#24) $Then_25 else $Else_26 | |
WhileContinue_6: | |
#9 | (unknown) | 2 | &i | |
#10 | (unknown) | 1 | *#9 | |
#11 | (integer literal)| 1 | 1 | |
#12 | (unknown) | 1 | #10 + 1 | |
#13 | void | - | *#9 = #12 | |
#14 | void | 0 | {} | |
#15 | unreachable | - | goto $WhileCond_4 | |
WhileEnd_7: | |
#45 | void | 1 | {} | |
#46 | unreachable | - | return {} | |
Then_25: | |
#29 | (unknown) | 2 | &i | |
#30 | (unknown) | 1 | *#29 | |
#31 | (unknown) | 1 | &x | |
#32 | (unknown) | 1 | *#31 | |
#33 | (unknown) | 1 | #30 + #32 | |
#34 | void | - | *#29 = #33 | |
#35 | void | 1 | {} | |
#36 | unreachable | - | goto $EndIf_27 | |
Else_26: | |
#37 | void | 1 | {} | |
#38 | unreachable | - | goto $EndIf_27 | |
EndIf_27: | |
#39 | (unknown) | 0 | $Then_25:{} $Else_26:{} | |
#40 | void | 0 | {} | |
#41 | extern fn() | 1 | something | |
#42 | (unknown) | - | something() | |
#43 | void | 0 | {} | |
#44 | unreachable | - | goto $WhileContinue_6 | |
} | |
=============== IR analysis ===================== | |
fn doSomethingTenTimes { // (analyzed) | |
Entry_0: | |
#3 | void | - | var i: i32 = 0 | |
#8 | void | - | something() | |
#15 | void | - | something() | |
#22 | void | - | something() | |
#29 | void | - | something() | |
#36 | &i32 | 1 | &x | |
#37 | i32 | 1 | *#36 | |
#38 | i32 | 1 | 4 + #37 | |
#39 | &i32 | 1 | &i | |
#40 | void | - | *#39 = #38 | |
#41 | void | - | something() | |
#42 | &i32 | 2 | &i | |
#43 | i32 | 1 | *#42 | |
#46 | i32 | 1 | #43 + 1 | |
#47 | void | - | *#42 = #46 | |
#48 | &i32 | 1 | &i | |
#49 | i32 | 1 | *#48 | |
#52 | bool | 1 | #49 < 10 | |
#55 | unreachable | - | if (#52) $WhileBody_53 else $WhileEnd_54 | |
WhileBody_53: | |
#56 | &i32 | 1 | &i | |
#57 | i32 | 1 | *#56 | |
#60 | bool | 1 | #57 == 4 | |
#63 | unreachable | - | if (#60) $Then_61 else $Else_62 | |
WhileEnd_54: | |
#64 | unreachable | - | return {} | |
Then_61: | |
#65 | &i32 | 2 | &i | |
#66 | i32 | 1 | *#65 | |
#67 | &i32 | 1 | &x | |
#68 | i32 | 1 | *#67 | |
#69 | i32 | 1 | #66 + #68 | |
#70 | void | - | *#65 = #69 | |
#71 | void | - | something() | |
#72 | &i32 | 2 | &i | |
#73 | i32 | 1 | *#72 | |
#76 | i32 | 1 | #73 + 1 | |
#77 | void | - | *#72 = #76 | |
#78 | &i32 | 1 | &i | |
#79 | i32 | 1 | *#78 | |
#82 | bool | 1 | #79 < 10 | |
#83 | unreachable | - | if (#82) $WhileBody_53 else $WhileEnd_54 | |
Else_62: | |
#84 | void | - | something() | |
#85 | &i32 | 2 | &i | |
#86 | i32 | 1 | *#85 | |
#89 | i32 | 1 | #86 + 1 | |
#90 | void | - | *#85 = #89 | |
#91 | &i32 | 1 | &i | |
#92 | i32 | 1 | *#91 | |
#95 | bool | 1 | #92 < 10 | |
#96 | unreachable | - | if (#95) $WhileBody_53 else $WhileEnd_54 | |
} | |
=============== LLVM code generation ===================== | |
define void @doSomethingTenTimes(i32) #2 !dbg !4 { | |
Entry: | |
%x = alloca i32, align 4 | |
%i = alloca i32, align 4 | |
store i32 %0, i32* %x | |
call void @llvm.dbg.declare(metadata i32* %x, metadata !11, metadata !15), !dbg !16 | |
store i32 0, i32* %i, !dbg !17 | |
call void @llvm.dbg.declare(metadata i32* %i, metadata !12, metadata !15), !dbg !17 | |
call void @something(), !dbg !18 | |
call void @something(), !dbg !18 | |
call void @something(), !dbg !18 | |
call void @something(), !dbg !18 | |
%1 = load i32, i32* %x, !dbg !20 | |
%2 = add nsw i32 4, %1, !dbg !21 | |
store i32 %2, i32* %i, !dbg !21 | |
call void @something(), !dbg !18 | |
%3 = load i32, i32* %i, !dbg !22 | |
%4 = add nsw i32 %3, 1, !dbg !23 | |
store i32 %4, i32* %i, !dbg !23 | |
%5 = load i32, i32* %i, !dbg !24 | |
%6 = icmp slt i32 %5, 10, !dbg !25 | |
br i1 %6, label %WhileBody, label %WhileEnd, !dbg !25 | |
WhileBody: ; preds = %Else, %Then, %Entry | |
%7 = load i32, i32* %i, !dbg !26 | |
%8 = icmp eq i32 %7, 4, !dbg !27 | |
br i1 %8, label %Then, label %Else, !dbg !27 | |
WhileEnd: ; preds = %Else, %Then, %Entry | |
ret void, !dbg !28 | |
Then: ; preds = %WhileBody | |
%9 = load i32, i32* %i, !dbg !29 | |
%10 = load i32, i32* %x, !dbg !20 | |
%11 = add nsw i32 %9, %10, !dbg !21 | |
store i32 %11, i32* %i, !dbg !21 | |
call void @something(), !dbg !18 | |
%12 = load i32, i32* %i, !dbg !22 | |
%13 = add nsw i32 %12, 1, !dbg !23 | |
store i32 %13, i32* %i, !dbg !23 | |
%14 = load i32, i32* %i, !dbg !24 | |
%15 = icmp slt i32 %14, 10, !dbg !25 | |
br i1 %15, label %WhileBody, label %WhileEnd, !dbg !25 | |
Else: ; preds = %WhileBody | |
call void @something(), !dbg !18 | |
%16 = load i32, i32* %i, !dbg !22 | |
%17 = add nsw i32 %16, 1, !dbg !23 | |
store i32 %17, i32* %i, !dbg !23 | |
%18 = load i32, i32* %i, !dbg !24 | |
%19 = icmp slt i32 %18, 10, !dbg !25 | |
br i1 %19, label %WhileBody, label %WhileEnd, !dbg !25 | |
} | |
=============== LLVM optimization pass ===================== | |
define void @doSomethingTenTimes(i32) local_unnamed_addr #0 !dbg !4 { | |
Entry: | |
tail call void @llvm.dbg.value(metadata i32 %0, i64 0, metadata !11, metadata !15), !dbg !16 | |
tail call void @llvm.dbg.value(metadata i32 0, i64 0, metadata !12, metadata !15), !dbg !17 | |
tail call void @something() #2, !dbg !18 | |
tail call void @something() #2, !dbg !18 | |
tail call void @something() #2, !dbg !18 | |
tail call void @something() #2, !dbg !18 | |
tail call void @something() #2, !dbg !18 | |
%1 = add i32 %0, 5, !dbg !20 | |
tail call void @llvm.dbg.value(metadata i32 %1, i64 0, metadata !12, metadata !15), !dbg !17 | |
%2 = icmp slt i32 %1, 10, !dbg !21 | |
br i1 %2, label %WhileBody.preheader, label %WhileEnd, !dbg !21 | |
WhileBody.preheader: ; preds = %Entry | |
br label %WhileBody, !dbg !22 | |
WhileBody: ; preds = %WhileBody.backedge, %WhileBody.preheader | |
%i.0 = phi i32 [ %1, %WhileBody.preheader ], [ %i.0.be, %WhileBody.backedge ] | |
%3 = icmp eq i32 %i.0, 4, !dbg !22 | |
tail call void @something() #2, !dbg !18 | |
br i1 %3, label %WhileBody.backedge, label %Else, !dbg !22 | |
WhileBody.backedge: ; preds = %WhileBody, %Else | |
%i.0.be = phi i32 [ %4, %Else ], [ %1, %WhileBody ] | |
br label %WhileBody, !dbg !22 | |
WhileEnd.loopexit: ; preds = %Else | |
br label %WhileEnd, !dbg !23 | |
WhileEnd: ; preds = %WhileEnd.loopexit, %Entry | |
ret void, !dbg !23 | |
Else: ; preds = %WhileBody | |
%4 = add nsw i32 %i.0, 1, !dbg !20 | |
tail call void @llvm.dbg.value(metadata i32 %4, i64 0, metadata !12, metadata !15), !dbg !17 | |
%5 = icmp slt i32 %4, 10, !dbg !21 | |
br i1 %5, label %WhileBody.backedge, label %WhileEnd.loopexit, !dbg !21 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment