Andrew Kelley
|
e6fa2ee706
|
fix nested peer result locs with no memory loc
```zig
export fn entry2(c: bool) i32 {
return if (c)
i32(0)
else if (c)
i32(1)
else
i32(2);
}
```
```llvm
define i32 @entry2(i1) #2 !dbg !35 {
Entry:
%c = alloca i1, align 1
store i1 %0, i1* %c, align 1
call void @llvm.dbg.declare(metadata i1* %c, metadata !41, metadata !DIExpression()), !dbg !42
%1 = load i1, i1* %c, align 1, !dbg !43
br i1 %1, label %Then, label %Else, !dbg !43
Then: ; preds = %Entry
br label %EndIf3, !dbg !45
Else: ; preds = %Entry
%2 = load i1, i1* %c, align 1, !dbg !46
br i1 %2, label %Then1, label %Else2, !dbg !46
Then1: ; preds = %Else
br label %EndIf, !dbg !47
Else2: ; preds = %Else
br label %EndIf, !dbg !47
EndIf: ; preds = %Else2, %Then1
%3 = phi i32 [ 1, %Then1 ], [ 2, %Else2 ], !dbg !47
br label %EndIf3, !dbg !45
EndIf3: ; preds = %EndIf, %Then
%4 = phi i32 [ 0, %Then ], [ %3, %EndIf ], !dbg !45
ret i32 %4, !dbg !48
}
```
|
2019-06-12 18:08:56 -04:00 |
|
Andrew Kelley
|
1526d89711
|
fix @bitCast with runtime scalar and dest result loc var
|
2019-06-12 15:02:46 -04:00 |
|
Andrew Kelley
|
35352e0f48
|
fix alignment problem with @bitCast result location
|
2019-06-12 13:49:57 -04:00 |
|
Andrew Kelley
|
278c7a2bc3
|
fix @bitCast regressions
|
2019-06-12 13:42:21 -04:00 |
|
Andrew Kelley
|
ce5d50e4ed
|
fix runtime if nested inside comptime if
|
2019-06-11 18:26:01 -04:00 |
|
Andrew Kelley
|
b3a4ec1bd2
|
fix returning scalar values
```zig
export fn entry1() i32 {
return bar();
}
```
```llvm
define i32 @entry1() #2 !dbg !35 {
Entry:
%0 = call fastcc i32 @bar(), !dbg !39
ret i32 %0, !dbg !41
}
```
|
2019-06-11 16:04:04 -04:00 |
|
Andrew Kelley
|
e1d14e73b5
|
fix @bitCast semantics when there is no parent result loc
|
2019-06-11 15:44:06 -04:00 |
|
Andrew Kelley
|
0ac566892d
|
fix for loop index variable not in scope
|
2019-06-11 14:15:58 -04:00 |
|
Andrew Kelley
|
515092210f
|
fix not checking return value of resolving result
|
2019-06-11 13:48:53 -04:00 |
|
Andrew Kelley
|
1c2e889820
|
fix struct and array init when result casted to anyerror!?T
previous commit message is incorrect, it was only for
anyerror!T
|
2019-06-11 13:44:09 -04:00 |
|
Andrew Kelley
|
fc8d881240
|
fix struct and array init when result casted to anyerror!?T
|
2019-06-11 13:27:01 -04:00 |
|
Andrew Kelley
|
06f307ff77
|
fix implicit casting return value struct/arary init to optional
|
2019-06-11 12:19:57 -04:00 |
|
Andrew Kelley
|
a431a73dab
|
fixes for crashes and compile errors
|
2019-06-11 01:24:55 -04:00 |
|
Andrew Kelley
|
b053a65573
|
fix comptime variables
|
2019-06-11 00:36:03 -04:00 |
|
Andrew Kelley
|
7411a88d5f
|
fix comptime function calls
|
2019-06-11 00:27:10 -04:00 |
|
Andrew Kelley
|
33371ab55c
|
Merge remote-tracking branch 'origin/master' into copy-elision-3
|
2019-06-11 00:09:58 -04:00 |
|
Andrew Kelley
|
d504318f2e
|
remove the final legacy stack allocation
|
2019-06-10 23:54:28 -04:00 |
|
Andrew Kelley
|
f6d4e2565e
|
use result loc for ref instruction
|
2019-06-10 23:51:43 -04:00 |
|
Andrew Kelley
|
a0427d29e4
|
fix peer result locations in the face of unreachable
```zig
export fn entry() void {
var nothing: ?*i32 = null;
var whatever = if (nothing) |x1| i32(1) else unreachable;
}
```
```llvm
define void @entry() #2 !dbg !35 {
Entry:
%nothing = alloca i32*, align 8
%whatever = alloca i32, align 4
store i32* null, i32** %nothing, align 8, !dbg !45
call void @llvm.dbg.declare(metadata i32** %nothing, metadata !39, metadata !DIExpression()), !dbg !45
%0 = load i32*, i32** %nothing, align 8, !dbg !46
%1 = icmp ne i32* %0, null, !dbg !46
br i1 %1, label %OptionalThen, label %OptionalElse, !dbg !46
OptionalThen: ; preds = %Entry
call void @llvm.dbg.declare(metadata i32** %nothing, metadata !43, metadata !DIExpression()), !dbg !46
store i32 1, i32* %whatever, align 4, !dbg !47
br label %OptionalEndIf, !dbg !46
OptionalElse: ; preds = %Entry
tail call fastcc void @panic(%"[]u8"* @1, %builtin.StackTrace* null), !dbg !48
unreachable, !dbg !48
OptionalEndIf: ; preds = %OptionalThen
call void @llvm.dbg.declare(metadata i32* %whatever, metadata !44, metadata !DIExpression()), !dbg !49
ret void, !dbg !50
}
```
|
2019-06-10 23:25:43 -04:00 |
|
Andrew Kelley
|
4582ec518f
|
result location semantics for vector to array
```zig
export fn entry() void {
var x: @Vector(4, i32) = undefined;
var y: [4]i32 = x;
}
```
```llvm
define void @entry() #2 !dbg !35 {
Entry:
%x = alloca <4 x i32>, align 16
%y = alloca [4 x i32], align 4
%0 = bitcast <4 x i32>* %x to i8*, !dbg !47
call void @llvm.memset.p0i8.i64(i8* align 16 %0, i8 -86, i64 16, i1 false), !dbg !47
call void @llvm.dbg.declare(metadata <4 x i32>* %x, metadata !39, metadata !DIExpression()), !dbg !47
%1 = load <4 x i32>, <4 x i32>* %x, align 16, !dbg !48
%2 = bitcast [4 x i32]* %y to <4 x i32>*, !dbg !48
store <4 x i32> %1, <4 x i32>* %2, align 16, !dbg !48
call void @llvm.dbg.declare(metadata [4 x i32]* %y, metadata !45, metadata !DIExpression()), !dbg !49
ret void, !dbg !50
}
```
|
2019-06-10 19:49:24 -04:00 |
|
Andrew Kelley
|
9a324ecb42
|
result loc semantics for loading packed struct pointer to packed struct
```zig
export fn entry() void {
var x = foo();
var ptr = &x.b;
var y = ptr.*;
}
const Foo = packed struct {
a: u24 = 1,
b: Bar = Bar{},
};
const Bar = packed struct {
a: u4 = 2,
b: u4 = 3,
};
```
```llvm
define void @entry() #2 !dbg !35 {
Entry:
%x = alloca %Foo, align 1
%ptr = alloca i32*, align 8
%y = alloca %Bar, align 1
call fastcc void @foo(%Foo* sret %x), !dbg !55
call void @llvm.dbg.declare(metadata %Foo* %x, metadata !39, metadata !DIExpression()), !dbg !56
%0 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0, !dbg !57
store i32* %0, i32** %ptr, align 8, !dbg !57
call void @llvm.dbg.declare(metadata i32** %ptr, metadata !51, metadata !DIExpression()), !dbg !58
%1 = load i32*, i32** %ptr, align 8, !dbg !59
%2 = load i32, i32* %1, align 1, !dbg !60
%3 = lshr i32 %2, 24, !dbg !60
%4 = trunc i32 %3 to i8, !dbg !60
%5 = bitcast %Bar* %y to i8*, !dbg !60
store i8 %4, i8* %5, !dbg !60
call void @llvm.dbg.declare(metadata %Bar* %y, metadata !54, metadata !DIExpression()), !dbg !61
ret void, !dbg !62
}
```
|
2019-06-10 19:11:34 -04:00 |
|
Andrew Kelley
|
65f6ea66f4
|
result loc semantics for @sliceToBytes and @bytesToSlice
|
2019-06-10 18:34:27 -04:00 |
|
Andrew Kelley
|
ee3f7e20f6
|
result location semantics for cmpxchg
|
2019-06-10 17:49:36 -04:00 |
|
Andrew Kelley
|
b9c033ae1a
|
result location semantics for error union wrapping an error
|
2019-06-10 17:28:25 -04:00 |
|
Andrew Kelley
|
4f085b8d2c
|
result location semantics for error union wrapping a payload
|
2019-06-10 16:55:07 -04:00 |
|
Andrew Kelley
|
eaa9d8bdac
|
result location semantics for optional wrap
|
2019-06-10 16:20:13 -04:00 |
|
Andrew Kelley
|
c362895116
|
result location semantics for slices
```zig
export fn entry() void {
var buf: [10]u8 = undefined;
const slice1: []const u8 = &buf;
const slice2 = buf[0..];
}
```
```llvm
define void @entry() #2 !dbg !35 {
Entry:
%buf = alloca [10 x i8], align 1
%slice1 = alloca %"[]u8", align 8
%slice2 = alloca %"[]u8", align 8
%0 = bitcast [10 x i8]* %buf to i8*, !dbg !46
call void @llvm.memset.p0i8.i64(i8* align 1 %0, i8 -86, i64 10, i1 false), !dbg !46
call void @llvm.dbg.declare(metadata [10 x i8]* %buf, metadata !39, metadata !DIExpression()), !dbg !46
%1 = getelementptr inbounds %"[]u8", %"[]u8"* %slice1, i32 0, i32 0, !dbg !47
%2 = getelementptr inbounds [10 x i8], [10 x i8]* %buf, i64 0, i64 0, !dbg !47
store i8* %2, i8** %1, align 8, !dbg !47
%3 = getelementptr inbounds %"[]u8", %"[]u8"* %slice1, i32 0, i32 1, !dbg !47
store i64 10, i64* %3, align 8, !dbg !47
call void @llvm.dbg.declare(metadata %"[]u8"* %slice1, metadata !44, metadata !DIExpression()), !dbg !48
%4 = getelementptr inbounds %"[]u8", %"[]u8"* %slice2, i32 0, i32 0, !dbg !49
%5 = getelementptr inbounds [10 x i8], [10 x i8]* %buf, i64 0, i64 0, !dbg !49
store i8* %5, i8** %4, align 8, !dbg !49
%6 = getelementptr inbounds %"[]u8", %"[]u8"* %slice2, i32 0, i32 1, !dbg !49
store i64 10, i64* %6, align 8, !dbg !49
call void @llvm.dbg.declare(metadata %"[]u8"* %slice2, metadata !45, metadata !DIExpression()), !dbg !50
ret void, !dbg !51
}
```
|
2019-06-10 15:49:45 -04:00 |
|
Andrew Kelley
|
17b1ac5d03
|
result location semantics for @bitCast
```zig
export fn entry() void {
var x = @bitCast(f32, foo());
}
```
```llvm
define void @entry() #2 !dbg !35 {
Entry:
%x = alloca float, align 4
%0 = bitcast float* %x to %Foo*, !dbg !42
call fastcc void @foo(%Foo* sret %0), !dbg !42
call void @llvm.dbg.declare(metadata float* %x, metadata !39, metadata !DIExpression()), !dbg !43
ret void, !dbg !44
}
```
|
2019-06-10 12:24:19 -04:00 |
|
Andrew Kelley
|
1a51bf6304
|
hook up result locations for union initializations
```zig
export fn entry() void {
var x = Foo{ .bar = bar() };
}
```
```llvm
define void @entry() #2 !dbg !44 {
Entry:
%x = alloca %Foo, align 4
%0 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 1, !dbg !68
store i1 true, i1* %0, align 1, !dbg !68
%1 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0, !dbg !68
%2 = bitcast { i32, [4 x i8] }* %1 to %Bar*, !dbg !68
call fastcc void @bar(%Bar* sret %2), !dbg !68
call void @llvm.dbg.declare(metadata %Foo* %x, metadata !48, metadata !DIExpression()), !dbg !69
ret void, !dbg !70
}
```
|
2019-06-10 11:15:32 -04:00 |
|
Andrew Kelley
|
b7811d3269
|
whitespace cleanup
|
2019-06-10 00:45:24 -04:00 |
|
SamTebbs33
|
6c160b8856
|
Add check for null body in if, for and while
|
2019-06-10 00:41:33 -04:00 |
|
Andrew Kelley
|
4e2b2822f1
|
inferred array size of array literals works
|
2019-06-09 19:55:15 -04:00 |
|
Andrew Kelley
|
3a4b749c8a
|
Merge remote-tracking branch 'origin/master' into copy-elision-3
|
2019-06-09 19:44:01 -04:00 |
|
Andrew Kelley
|
b735764898
|
different array literal syntax when inferring the size
old syntax: []i32{1, 2, 3}
new syntax: [_]i32{1, 2, 3}
closes #1797
|
2019-06-09 19:26:32 -04:00 |
|
Andrew Kelley
|
59fe13772f
|
result loc semantics for array initialization
```zig
export fn entry() void {
var x = [3]Bar{ bar(), bar(), Bar{ .y = 12 } };
}
```
```llvm
define void @entry() #2 !dbg !35 {
Entry:
%x = alloca [3 x %Bar], align 4
%0 = getelementptr inbounds [3 x %Bar], [3 x %Bar]* %x, i64 0, i64 0, !dbg !48
call fastcc void @bar(%Bar* sret %0), !dbg !48
%1 = getelementptr inbounds [3 x %Bar], [3 x %Bar]* %x, i64 0, i64 1, !dbg !49
call fastcc void @bar(%Bar* sret %1), !dbg !49
%2 = getelementptr inbounds [3 x %Bar], [3 x %Bar]* %x, i64 0, i64 2, !dbg !50
%3 = bitcast %Bar* %2 to i8*, !dbg !50
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %3, i8* align 4 bitcast (%Bar* @0 to i8*), i64 4, i1 false), !dbg !50
call void @llvm.dbg.declare(metadata [3 x %Bar]* %x, metadata !39, metadata !DIExpression()), !dbg !51
ret void, !dbg !52
}
```
|
2019-06-09 12:03:15 -04:00 |
|
Andrew Kelley
|
3ec766abe3
|
remove ResultLocField dead code
|
2019-06-09 10:46:13 -04:00 |
|
Andrew Kelley
|
771e88951a
|
result location mechanism for struct initialization
```zig
export fn entry() void {
const static = Foo{
.x = 9,
.bar = Bar{ .y = 10 },
};
const runtime = foo(true);
}
fn foo(c: bool) Foo {
return Foo{
.x = 12,
.bar = if (c) bar1() else bar2(),
};
}
fn bar1() Bar {
return Bar{ .y = 34 };
}
fn bar2() Bar {
return Bar{ .y = 56 };
}
```
```llvm
@0 = internal unnamed_addr constant %Foo { i32 9, %Bar { i32 10 } }, align 4
@1 = internal unnamed_addr constant %Bar { i32 34 }, align 4
@2 = internal unnamed_addr constant %Bar { i32 56 }, align 4
define void @entry() #2 !dbg !35 {
Entry:
%runtime = alloca %Foo, align 4
call void @llvm.dbg.declare(metadata %Foo* @0, metadata !39, metadata !DIExpression()), !dbg !50
call fastcc void @foo(%Foo* sret %runtime, i1 true), !dbg !51
call void @llvm.dbg.declare(metadata %Foo* %runtime, metadata !49, metadata !DIExpression()), !dbg !52
ret void, !dbg !53
}
define internal fastcc void @foo(%Foo* nonnull sret, i1) unnamed_addr #2 !dbg !54 {
Entry:
%c = alloca i1, align 1
store i1 %1, i1* %c, align 1
call void @llvm.dbg.declare(metadata i1* %c, metadata !60, metadata !DIExpression()), !dbg !61
%2 = getelementptr inbounds %Foo, %Foo* %0, i32 0, i32 0, !dbg !62
store i32 12, i32* %2, align 4, !dbg !62
%3 = getelementptr inbounds %Foo, %Foo* %0, i32 0, i32 1, !dbg !64
%4 = load i1, i1* %c, align 1, !dbg !65
br i1 %4, label %Then, label %Else, !dbg !65
Then: ; preds = %Entry
call fastcc void @bar1(%Bar* sret %3), !dbg !66
br label %EndIf, !dbg !64
Else: ; preds = %Entry
call fastcc void @bar2(%Bar* sret %3), !dbg !67
br label %EndIf, !dbg !64
EndIf: ; preds = %Else, %Then
ret void, !dbg !68
}
define internal fastcc void @bar1(%Bar* nonnull sret) unnamed_addr #2 !dbg !69 {
Entry:
%1 = bitcast %Bar* %0 to i8*, !dbg !73
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %1, i8* align 4 bitcast (%Bar* @1 to i8*), i64 4, i1 false), !dbg !73
ret void, !dbg !73
}
define internal fastcc void @bar2(%Bar* nonnull sret) unnamed_addr #2 !dbg !75 {
Entry:
%1 = bitcast %Bar* %0 to i8*, !dbg !76
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %1, i8* align 4 bitcast (%Bar* @2 to i8*), i64 4, i1 false), !dbg !76
ret void, !dbg !76
}
!39 = !DILocalVariable(name: "static", scope: !40, file: !5, line: 2, type: !41)
!49 = !DILocalVariable(name: "runtime", scope: !40, file: !5, line: 6, type: !41)
```
|
2019-06-08 18:51:31 -04:00 |
|
Andrew Kelley
|
52eb347188
|
hook up result locs for try
|
2019-06-08 01:16:19 -04:00 |
|
Andrew Kelley
|
a2fff2628f
|
hook up peer result locs to orelse keyword
|
2019-06-08 01:09:19 -04:00 |
|
Andrew Kelley
|
b1efba0c70
|
hook up peer result locs to catch
```zig
export fn entry() void {
var x = crap() catch bar();
}
```
```llvm
define void @entry() #2 !dbg !40 {
Entry:
%0 = alloca { i16, %Foo }, align 4
%x = alloca %Foo, align 4
call fastcc void @crap({ i16, %Foo }* sret %0), !dbg !50
%1 = getelementptr inbounds { i16, %Foo }, { i16, %Foo }* %0, i32 0, i32 0, !dbg !51
%2 = load i16, i16* %1, align 2, !dbg !51
%3 = icmp ne i16 %2, 0, !dbg !51
br i1 %3, label %UnwrapErrError, label %UnwrapErrOk, !dbg !51
UnwrapErrError: ; preds = %Entry
call fastcc void @bar(%Foo* sret %x), !dbg !52
br label %UnwrapErrEnd, !dbg !51
UnwrapErrOk: ; preds = %Entry
%4 = getelementptr inbounds { i16, %Foo }, { i16, %Foo }* %0, i32 0, i32 1, !dbg !51
%5 = bitcast %Foo* %4 to i8*, !dbg !51
%6 = bitcast %Foo* %x to i8*, !dbg !51
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %6, i8* align 4 %5, i64 4, i1 false), !dbg !51
br label %UnwrapErrEnd, !dbg !51
UnwrapErrEnd: ; preds = %UnwrapErrOk, %UnwrapErrError
ret void, !dbg !53
}
```
|
2019-06-07 17:37:29 -04:00 |
|
Andrew Kelley
|
2b0a1b7b14
|
hook up result locs to for loops
```zig
export fn entry() void {
var buf: [10]u8 = undefined;
var x = for (buf) |x| break foo() else bar();
}
```
```llvm
define void @entry() #2 !dbg !35 {
Entry:
%buf = alloca [10 x i8], align 1
%i = alloca i64, align 8
%x = alloca %Foo, align 4
%0 = bitcast [10 x i8]* %buf to i8*, !dbg !51
call void @llvm.memset.p0i8.i64(i8* align 1 %0, i8 -86, i64 10, i1 false), !dbg !51
call void @llvm.dbg.declare(metadata [10 x i8]* %buf, metadata !39, metadata !DIExpression()), !dbg !51
store i64 0, i64* %i, align 8, !dbg !52
call void @llvm.dbg.declare(metadata i64* %i, metadata !44, metadata !DIExpression()), !dbg !52
br label %ForCond, !dbg !52
ForCond: ; preds = %Entry
%1 = load i64, i64* %i, align 8, !dbg !52
%2 = icmp ult i64 %1, 10, !dbg !52
br i1 %2, label %ForBody, label %ForElse, !dbg !52
ForBody: ; preds = %ForCond
%3 = getelementptr inbounds [10 x i8], [10 x i8]* %buf, i64 0, i64 %1, !dbg !52
call void @llvm.dbg.declare(metadata i8* %3, metadata !45, metadata !DIExpression()), !dbg !53
call fastcc void @foo(%Foo* sret %x), !dbg !54
br label %ForEnd, !dbg !55
ForElse: ; preds = %ForCond
call fastcc void @bar(%Foo* sret %x), !dbg !56
br label %ForEnd, !dbg !52
ForEnd: ; preds = %ForElse, %ForBody
call void @llvm.dbg.declare(metadata %Foo* %x, metadata !46, metadata !DIExpression()), !dbg !57
ret void, !dbg !58
}
```
|
2019-06-07 15:58:18 -04:00 |
|
Andrew Kelley
|
ede3436b08
|
hook up peer result locs to while bool and optional
|
2019-06-07 15:48:28 -04:00 |
|
Andrew Kelley
|
ec8d8a9774
|
hook up while on error unions with result locations
```zig
export fn entry() void {
var c: anyerror!i32 = 1234;
var x = while (c) |y| break foo() else |e| bar();
}
```
```llvm
define void @entry() #2 !dbg !39 {
Entry:
%c = alloca { i16, i32 }, align 4
%x = alloca %Foo, align 4
%0 = bitcast { i16, i32 }* %c to i8*, !dbg !56
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 bitcast ({ i16, i32 }* @0 to i8*), i64 8, i1 false), !dbg !56
call void @llvm.dbg.declare(metadata { i16, i32 }* %c, metadata !43, metadata !DIExpression()), !dbg !56
br label %WhileCond, !dbg !57
WhileCond: ; preds = %Entry
%1 = getelementptr inbounds { i16, i32 }, { i16, i32 }* %c, i32 0, i32 0, !dbg !58
%2 = load i16, i16* %1, align 2, !dbg !58
%3 = icmp ne i16 %2, 0, !dbg !58
br i1 %3, label %WhileElse, label %WhileBody, !dbg !58
WhileBody: ; preds = %WhileCond
%4 = getelementptr inbounds { i16, i32 }, { i16, i32 }* %c, i32 0, i32 1, !dbg !57
call void @llvm.dbg.declare(metadata i32* %4, metadata !50, metadata !DIExpression()), !dbg !57
call fastcc void @foo(%Foo* sret %x), !dbg !59
br label %WhileEnd, !dbg !60
WhileElse: ; preds = %WhileCond
%5 = getelementptr inbounds { i16, i32 }, { i16, i32 }* %c, i32 0, i32 0, !dbg !61
call void @llvm.dbg.declare(metadata i16* %5, metadata !51, metadata !DIExpression()), !dbg !61
call fastcc void @bar(%Foo* sret %x), !dbg !61
br label %WhileEnd, !dbg !57
WhileEnd: ; preds = %WhileElse, %WhileBody
call void @llvm.dbg.declare(metadata %Foo* %x, metadata !52, metadata !DIExpression()), !dbg !62
ret void, !dbg !63
}
```
|
2019-06-07 15:22:21 -04:00 |
|
Andrew Kelley
|
0e8b65c537
|
hook up peer result locs to if optional and if err
|
2019-06-07 14:49:26 -04:00 |
|
Andrew Kelley
|
ec17f4ebbe
|
fix behavior for peer result locs with one prong unreachable
|
2019-06-07 14:20:35 -04:00 |
|
Andrew Kelley
|
5784631fab
|
update the default macos version min to 10.14
|
2019-06-07 12:20:02 -04:00 |
|
Andrew Kelley
|
4c222a482f
|
fix behavior for non sret fn calls
|
2019-06-07 11:51:50 -04:00 |
|
Andrew Kelley
|
76a3938d69
|
no-copy semantics for peer result function calls
```zig
export fn entry() void {
var c = true;
var x = if (c) foo() else bar();
}
```
```llvm
define void @entry() #2 !dbg !35 {
Entry:
%c = alloca i1, align 1
%x = alloca %Foo, align 4
store i1 true, i1* %c, align 1, !dbg !47
call void @llvm.dbg.declare(metadata i1* %c, metadata !39, metadata !DIExpression()), !dbg !48
%0 = load i1, i1* %c, align 1, !dbg !49
br i1 %0, label %Then, label %Else, !dbg !49
Then: ; preds = %Entry
call fastcc void @foo(%Foo* sret %x), !dbg !50
br label %EndIf, !dbg !51
Else: ; preds = %Entry
call fastcc void @bar(%Foo* sret %x), !dbg !52
br label %EndIf, !dbg !51
EndIf: ; preds = %Else, %Then
call void @llvm.dbg.declare(metadata %Foo* %x, metadata !42, metadata !DIExpression()), !dbg !53
ret void, !dbg !54
}
```
|
2019-06-07 11:34:47 -04:00 |
|
Andrew Kelley
|
b19b1c1298
|
no-copy semantics for switch expressions
```zig
export fn entry() void {
var c: i32 = 1234;
var x = switch (c) {
1 => u8(1),
2...4 => u16(2),
else => u32(3),
};
}
```
```llvm
define void @entry() #2 !dbg !35 {
Entry:
%c = alloca i32, align 4
%x = alloca i32, align 4
store i32 1234, i32* %c, align 4, !dbg !44
call void @llvm.dbg.declare(metadata i32* %c, metadata !39, metadata !DIExpression()), !dbg !44
%0 = load i32, i32* %c, align 4, !dbg !45
%1 = icmp sge i32 %0, 2, !dbg !46
%2 = icmp sle i32 %0, 4, !dbg !46
%3 = and i1 %1, %2, !dbg !46
br i1 %3, label %SwitchRangeYes, label %SwitchRangeNo, !dbg !46
SwitchRangeYes: ; preds = %Entry
br label %SwitchEnd, !dbg !45
SwitchElse: ; preds = %SwitchRangeNo
br label %SwitchEnd, !dbg !45
SwitchProng: ; preds = %SwitchRangeNo
br label %SwitchEnd, !dbg !45
SwitchEnd: ; preds = %SwitchProng, %SwitchElse, %SwitchRangeYes
%4 = phi i32 [ 2, %SwitchRangeYes ], [ 3, %SwitchElse ], [ 1, %SwitchProng ], !dbg !45
store i32 %4, i32* %x, align 4, !dbg !45
call void @llvm.dbg.declare(metadata i32* %x, metadata !42, metadata !DIExpression()), !dbg !47
ret void, !dbg !48
SwitchRangeNo: ; preds = %Entry
switch i32 %0, label %SwitchElse [
i32 1, label %SwitchProng
], !dbg !45
}
```
|
2019-06-04 14:47:01 -04:00 |
|
Nick Erdmann
|
d83b15febf
|
src/ast_render.cpp: fix rendering of character literals <= 0x0f
|
2019-06-04 13:00:41 -04:00 |
|