Skip to content

Instantly share code, notes, and snippets.

@andrewrk
Created October 27, 2016 07:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andrewrk/1bb6d8343ad3a5941a3229469fc07445 to your computer and use it in GitHub Desktop.
Save andrewrk/1bb6d8343ad3a5941a3229469fc07445 to your computer and use it in GitHub Desktop.
more Zig IR progress
=============== 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