mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 20:11:17 +00:00
Add macro arguments &foo $foo #foo.
C ABI compatibility aarch64, win64, x86, x64 Added debug info
This commit is contained in:
committed by
Christoffer Lerno
parent
4222f2731e
commit
3c15e495dd
@@ -20,49 +20,42 @@ public func void test()
|
||||
|
||||
// #expect: assert_variants.ll
|
||||
|
||||
%x = alloca i32
|
||||
%y = alloca i32
|
||||
%z = alloca i32
|
||||
%0 = call i32 @assert_variants.foo()
|
||||
store i32 %0, i32* %x
|
||||
%1 = call i32 @assert_variants.foo()
|
||||
store i32 %1, i32* %y
|
||||
%2 = call i32 @assert_variants.foo()
|
||||
store i32 %2, i32* %z
|
||||
|
||||
%3 = load i32, i32* %x
|
||||
%gt = icmp sgt i32 %3, 0
|
||||
call void @llvm.assume(i1 %gt)
|
||||
|
||||
%4 = load i32, i32* %y
|
||||
%gt1 = icmp sgt i32 %4, 0
|
||||
call void @llvm.assume(i1 %gt1)
|
||||
%5 = load i32, i32* %z
|
||||
%gt2 = icmp sgt i32 %5, 0
|
||||
call void @llvm.assume(i1 %gt2)
|
||||
|
||||
%6 = load i32, i32* %x
|
||||
%gt3 = icmp sgt i32 %6, 0
|
||||
call void @llvm.assume(i1 %gt3)
|
||||
|
||||
%7 = load i32, i32* %y
|
||||
%gt4 = icmp sgt i32 %7, 0
|
||||
call void @llvm.assume(i1 %gt4)
|
||||
|
||||
%8 = load i32, i32* %z
|
||||
%gt5 = icmp sgt i32 %8, 0
|
||||
call void @llvm.assume(i1 %gt5)
|
||||
|
||||
%9 = load i32, i32* %x
|
||||
%gt6 = icmp sgt i32 %9, 0
|
||||
call void @llvm.assume(i1 %gt6)
|
||||
|
||||
%10 = load i32, i32* %x
|
||||
%lt = icmp slt i32 %10, 1
|
||||
%11 = icmp eq i1 %lt, false
|
||||
call void @llvm.assume(i1 %11)
|
||||
|
||||
%12 = load i32, i32* %y
|
||||
%lt7 = icmp slt i32 %12, 1
|
||||
%13 = icmp eq i1 %lt7, false
|
||||
call void @llvm.assume(i1 %13)
|
||||
%x = alloca i32, align 4
|
||||
%y = alloca i32, align 4
|
||||
%z = alloca i32, align 4
|
||||
%0 = call i32 @assert_variants.foo()
|
||||
store i32 %0, i32* %x, align 4
|
||||
%1 = call i32 @assert_variants.foo()
|
||||
store i32 %1, i32* %y, align 4
|
||||
%2 = call i32 @assert_variants.foo()
|
||||
store i32 %2, i32* %z, align 4
|
||||
%3 = load i32, i32* %x, align 4
|
||||
%gt = icmp sgt i32 %3, 0
|
||||
call void @llvm.assume(i1 %gt)
|
||||
%4 = load i32, i32* %y, align 4
|
||||
%gt1 = icmp sgt i32 %4, 0
|
||||
call void @llvm.assume(i1 %gt1)
|
||||
%5 = load i32, i32* %z, align 4
|
||||
%gt2 = icmp sgt i32 %5, 0
|
||||
call void @llvm.assume(i1 %gt2)
|
||||
%6 = load i32, i32* %x, align 4
|
||||
%gt3 = icmp sgt i32 %6, 0
|
||||
call void @llvm.assume(i1 %gt3)
|
||||
%7 = load i32, i32* %y, align 4
|
||||
%gt4 = icmp sgt i32 %7, 0
|
||||
call void @llvm.assume(i1 %gt4)
|
||||
%8 = load i32, i32* %z, align 4
|
||||
%gt5 = icmp sgt i32 %8, 0
|
||||
call void @llvm.assume(i1 %gt5)
|
||||
%9 = load i32, i32* %x, align 4
|
||||
%gt6 = icmp sgt i32 %9, 0
|
||||
call void @llvm.assume(i1 %gt6)
|
||||
%10 = load i32, i32* %x, align 4
|
||||
%lt = icmp slt i32 %10, 1
|
||||
%not = xor i1 %lt, true
|
||||
call void @llvm.assume(i1 %not)
|
||||
%11 = load i32, i32* %y, align 4
|
||||
%lt7 = icmp slt i32 %11, 1
|
||||
%not8 = xor i1 %lt7, true
|
||||
call void @llvm.assume(i1 %not8)
|
||||
ret void
|
||||
@@ -8,20 +8,22 @@ func void! test()
|
||||
// #expect: rethrow.ll
|
||||
|
||||
%i = alloca i32
|
||||
%i1 = alloca i128
|
||||
%0 = alloca i128
|
||||
store i128 0, i128* %i1
|
||||
%1 = load i128, i128* %i1
|
||||
%2 = icmp eq i128 %1, 0
|
||||
br i1 %2, label %after_check, label %error
|
||||
%i1 = alloca { i64, i64 }, align 8
|
||||
%error_var = alloca { i64, i64 }, align 8
|
||||
store { i64, i64 } zeroinitializer, { i64, i64 }* %i1
|
||||
store i32 0, i32* %i
|
||||
%0 = load { i64, i64 }, { i64, i64 }* %i1
|
||||
%1 = extractvalue { i64, i64 } %0, 0
|
||||
%noerr = icmp eq i64 %1, 0
|
||||
br i1 %noerr, label %after_check, label %error
|
||||
error:
|
||||
store i128 %1, i128* %0
|
||||
store { i64, i64 } %0, { i64, i64 }* %error_var
|
||||
br label %guard_block
|
||||
after_check:
|
||||
%3 = load i32, i32* %i
|
||||
%2 = load i32, i32* %i, align 4
|
||||
br label %noerr_block
|
||||
guard_block:
|
||||
%4 = load i128, i128* %0
|
||||
ret i128 %4
|
||||
%3 = load { i64, i64 }, { i64, i64 }* %error_var
|
||||
ret { i64, i64 } %3
|
||||
noerr_block:
|
||||
ret i128 0
|
||||
ret { i64, i64 } zeroinitializer
|
||||
|
||||
@@ -3,11 +3,18 @@ func int* elvis(int *x, int *y)
|
||||
return x ?: y;
|
||||
}
|
||||
|
||||
|
||||
func int* elvis2(int *x, int *y)
|
||||
{
|
||||
return x ?: (y ?: x);
|
||||
}
|
||||
|
||||
func bool elvis3(bool x, bool y)
|
||||
{
|
||||
return x ?: y;
|
||||
}
|
||||
|
||||
|
||||
// #expect: elvis.ll
|
||||
|
||||
store i32* %0, i32** %x
|
||||
|
||||
42
test/test_suite/expressions/incdec.c3t
Normal file
42
test/test_suite/expressions/incdec.c3t
Normal file
@@ -0,0 +1,42 @@
|
||||
func void test(int* foo)
|
||||
{
|
||||
foo++;
|
||||
foo--;
|
||||
int y = 10;
|
||||
y++;
|
||||
y--;
|
||||
float z = 2.0;
|
||||
z++;
|
||||
++z;
|
||||
z--;
|
||||
}
|
||||
|
||||
// #expect: incdec.ll
|
||||
|
||||
%foo = alloca i32*, align 8
|
||||
%y = alloca i32, align 4
|
||||
%z = alloca float, align 4
|
||||
store i32* %0, i32** %foo
|
||||
%1 = load i32*, i32** %foo, align 8
|
||||
%ptrincdec = getelementptr i32, i32* %1, i8 1
|
||||
store i32* %ptrincdec, i32** %foo, align 8
|
||||
%2 = load i32*, i32** %foo, align 8
|
||||
%ptrincdec1 = getelementptr i32, i32* %2, i8 -1
|
||||
store i32* %ptrincdec1, i32** %foo, align 8
|
||||
store i32 10, i32* %y, align 4
|
||||
%3 = load i32, i32* %y, align 4
|
||||
%add = add nsw i32 %3, 1
|
||||
store i32 %add, i32* %y, align 4
|
||||
%4 = load i32, i32* %y, align 4
|
||||
%sub = sub nsw i32 %4, 1
|
||||
store i32 %sub, i32* %y, align 4
|
||||
store float 2.000000e+00, float* %z, align 4
|
||||
%5 = load float, float* %z, align 4
|
||||
%fincdec = fadd float %5, 1.000000e+00
|
||||
store float %fincdec, float* %z, align 4
|
||||
%6 = load float, float* %z, align 4
|
||||
%fincdec2 = fadd float %6, 1.000000e+00
|
||||
store float %fincdec2, float* %z, align 4
|
||||
%7 = load float, float* %z, align 4
|
||||
%fincdec3 = fadd float %7, -1.000000e+00
|
||||
store float %fincdec3, float* %z, align 4
|
||||
@@ -44,40 +44,40 @@ func void testSimple()
|
||||
@ExtraSimple = linkonce_odr constant i8 1
|
||||
|
||||
entry:
|
||||
%a = alloca %pointer_access.ExtraSimple
|
||||
%literal = alloca %pointer_access.ExtraSimple
|
||||
%0 = bitcast %pointer_access.ExtraSimple* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 72, i1 false)
|
||||
%c = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %literal, i32 0, i32 2
|
||||
%double = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c, i32 0, i32 4
|
||||
store double 3.300000e+00, double* %double
|
||||
%1 = load %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %literal
|
||||
store %pointer_access.ExtraSimple %1, %pointer_access.ExtraSimple* %a
|
||||
%c1 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
|
||||
%j = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c1, i32 0, i32 4
|
||||
store double 3.400000e+00, double* %j
|
||||
%a2 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 0
|
||||
%2 = load i32, i32* %a2
|
||||
%c3 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
|
||||
%e = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c3, i32 0, i32 0
|
||||
%3 = load double, double* %e
|
||||
%c4 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
|
||||
%f = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c4, i32 0, i32 3
|
||||
%4 = load double, double* %f
|
||||
%c5 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
|
||||
%j6 = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c5, i32 0, i32 4
|
||||
%5 = load double, double* %j6
|
||||
%g = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 5
|
||||
%6 = load i32, i32* %g
|
||||
%anon = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 4
|
||||
%o0 = bitcast %pointer_access.anon.0* %anon to double*
|
||||
%7 = load double, double* %o0
|
||||
%anon7 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 3
|
||||
%r = getelementptr inbounds %pointer_access.anon, %pointer_access.anon* %anon7, i32 0, i32 0
|
||||
%8 = load i32, i32* %r
|
||||
%anon8 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 3
|
||||
%s = getelementptr inbounds %pointer_access.anon, %pointer_access.anon* %anon8, i32 0, i32 1
|
||||
%9 = load i32, i32* %s
|
||||
call void (i8*, ...) @printf(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @0, i32 0, i32 0), i32 %2, double %3, double %4, double %5, i32 %6, double %7, i32 %8, i32 %9)
|
||||
ret void
|
||||
}
|
||||
%a = alloca %pointer_access.ExtraSimple, align 8
|
||||
%literal = alloca %pointer_access.ExtraSimple, align 8
|
||||
%0 = bitcast %pointer_access.ExtraSimple* %literal to i8*
|
||||
call void @llvm.memset.p0i8.i64(i8* align 8 %0, i8 0, i64 72, i1 false)
|
||||
%c = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %literal, i32 0, i32 2
|
||||
%double = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c, i32 0, i32 4
|
||||
store double 3.300000e+00, double* %double
|
||||
%1 = bitcast %pointer_access.ExtraSimple* %a to i8*
|
||||
%2 = bitcast %pointer_access.ExtraSimple* %literal to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 8 %2, i32 72, i1 false)
|
||||
%c1 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
|
||||
%j = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c1, i32 0, i32 4
|
||||
store double 3.400000e+00, double* %j, align 8
|
||||
%a2 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 0
|
||||
%3 = load i32, i32* %a2, align 4
|
||||
%c3 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
|
||||
%e = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c3, i32 0, i32 0
|
||||
%4 = load double, double* %e, align 8
|
||||
%c4 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
|
||||
%f = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c4, i32 0, i32 3
|
||||
%5 = load double, double* %f, align 8
|
||||
%c5 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 2
|
||||
%j6 = getelementptr inbounds %pointer_access.c, %pointer_access.c* %c5, i32 0, i32 4
|
||||
%6 = load double, double* %j6, align 8
|
||||
%g = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 5
|
||||
%7 = load i32, i32* %g, align 4
|
||||
%anon = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 4
|
||||
%o0 = bitcast %pointer_access.anon.0* %anon to double*
|
||||
%8 = load double, double* %o0, align 8
|
||||
%anon7 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 3
|
||||
%r = getelementptr inbounds %pointer_access.anon, %pointer_access.anon* %anon7, i32 0, i32 0
|
||||
%9 = load i32, i32* %r, align 4
|
||||
%anon8 = getelementptr inbounds %pointer_access.ExtraSimple, %pointer_access.ExtraSimple* %a, i32 0, i32 3
|
||||
%s = getelementptr inbounds %pointer_access.anon, %pointer_access.anon* %anon8, i32 0, i32 1
|
||||
%10 = load i32, i32* %s, align 4
|
||||
call void (i8*, ...) @printf(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @0, i32 0, i32 0), i32 %3, double %4, double %5, double %6, i32 %7, double %8, i32 %9, i32 %10)
|
||||
ret void
|
||||
24
test/test_suite/macros/hash_ident.c3
Normal file
24
test/test_suite/macros/hash_ident.c3
Normal file
@@ -0,0 +1,24 @@
|
||||
macro int cofefe(#a)
|
||||
{
|
||||
int y = 0;
|
||||
return #a + #a;
|
||||
}
|
||||
|
||||
int abc = 1;
|
||||
|
||||
public func int xx()
|
||||
{
|
||||
abc++;
|
||||
return abc;
|
||||
}
|
||||
|
||||
public func void main()
|
||||
{
|
||||
define $x = 0;
|
||||
int x = 0;
|
||||
@cofefe(x += 1);
|
||||
@cofefe(xx());
|
||||
@cofefe($x += 1); // #error: Cannot modify '$x' inside of a runtime scope.
|
||||
@cofefe(y += 1); // #error: Identifier 'y' could not be found.
|
||||
}
|
||||
|
||||
42
test/test_suite/pointers/pointer_index.c3t
Normal file
42
test/test_suite/pointers/pointer_index.c3t
Normal file
@@ -0,0 +1,42 @@
|
||||
module foo;
|
||||
|
||||
public func void test1(int* x)
|
||||
{
|
||||
int a = x[0];
|
||||
int b = *x;
|
||||
int c = x[1];
|
||||
int d = x[-1];
|
||||
}
|
||||
|
||||
public func void test2(byte* x)
|
||||
{
|
||||
byte a = x[0];
|
||||
byte b = *x;
|
||||
byte c = x[1];
|
||||
}
|
||||
|
||||
public func void test3(long* x)
|
||||
{
|
||||
long a = x[0];
|
||||
long b = *x;
|
||||
long c = x[1];
|
||||
}
|
||||
|
||||
// #expect: pointer_index.ll
|
||||
|
||||
%x = alloca i64*, align 8
|
||||
%a = alloca i64, align 8
|
||||
%b = alloca i64, align 8
|
||||
%c = alloca i64, align 8
|
||||
store i64* %0, i64** %x
|
||||
%1 = load i64*, i64** %x, align 8
|
||||
%ptridx = getelementptr inbounds i64, i64* %1, i64 0
|
||||
%2 = load i64, i64* %ptridx, align 8
|
||||
store i64 %2, i64* %a, align 8
|
||||
%3 = load i64*, i64** %x, align 8
|
||||
%4 = load i64, i64* %3, align 8
|
||||
store i64 %4, i64* %b, align 8
|
||||
%5 = load i64*, i64** %x, align 8
|
||||
%ptridx1 = getelementptr inbounds i64, i64* %5, i64 1
|
||||
%6 = load i64, i64* %ptridx1, align 8
|
||||
store i64 %6, i64* %c, align 8
|
||||
@@ -22,7 +22,8 @@ func void test(int i)
|
||||
// #expect: defer_break_switch.ll
|
||||
|
||||
switch.case:
|
||||
%4 = load i1, i1* %b
|
||||
%3 = load i8, i8* %b, align 1
|
||||
%4 = trunc i8 %3 to i1
|
||||
br i1 %4, label %if.then, label %if.exit
|
||||
|
||||
if.then:
|
||||
|
||||
@@ -22,7 +22,8 @@ func void test(int i)
|
||||
// #expect: defer_next_switch.ll
|
||||
|
||||
switch.case:
|
||||
%4 = load i1, i1* %b
|
||||
%3 = load i8, i8* %b, align 1
|
||||
%4 = trunc i8 %3 to i1
|
||||
br i1 %4, label %if.then, label %if.exit
|
||||
|
||||
if.then:
|
||||
|
||||
@@ -17,8 +17,8 @@ func int testReturnSwitch()
|
||||
// #expect: return_switch.ll
|
||||
|
||||
switch.entry:
|
||||
%2 = load i32, i32* %0
|
||||
switch i32 %2, label %switch.default [
|
||||
%1 = load i32, i32* %switch
|
||||
switch i32 %1, label %switch.default [
|
||||
i32 0, label %switch.case
|
||||
i32 3, label %switch.case
|
||||
i32 1, label %switch.case
|
||||
|
||||
@@ -18,7 +18,7 @@ func void test1()
|
||||
@Point = linkonce_odr constant i8 1
|
||||
|
||||
entry:
|
||||
%p = alloca %test.Point
|
||||
%0 = load %test.Point, %test.Point* @0
|
||||
store %test.Point %0, %test.Point* %p
|
||||
%p = alloca %test.Point, align 4
|
||||
%0 = bitcast %test.Point* %p to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%test.Point* @0 to i8*), i32 8, i1 false)
|
||||
|
||||
|
||||
@@ -6,12 +6,12 @@ func void test()
|
||||
|
||||
// #expect: slice_offset.ll
|
||||
|
||||
%x = alloca [3 x i32]
|
||||
%y = alloca %"int[]"
|
||||
%0 = load [3 x i32], [3 x i32]* @0
|
||||
store [3 x i32] %0, [3 x i32]* %x
|
||||
%x = alloca [3 x i32], align 4
|
||||
%y = alloca %"int[]", align 8
|
||||
%0 = bitcast [3 x i32]* %x to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @0 to i8*), i32 12, i1 false)
|
||||
%1 = bitcast [3 x i32]* %x to i32*
|
||||
%offset = getelementptr inbounds i32, i32* %1, i64 1
|
||||
%2 = insertvalue %"int[]" undef, i32* %offset, 0
|
||||
%3 = insertvalue %"int[]" %2, i64 1, 1
|
||||
store %"int[]" %3, %"int[]"* %y
|
||||
store %"int[]" %3, %"int[]"* %y, align 8
|
||||
|
||||
@@ -6,12 +6,13 @@ func void test()
|
||||
|
||||
// #expect: slice_offset_neg_end.ll
|
||||
|
||||
%x = alloca [3 x i32]
|
||||
%y = alloca %"int[]"
|
||||
%0 = load [3 x i32], [3 x i32]* @0
|
||||
store [3 x i32] %0, [3 x i32]* %x
|
||||
%x = alloca [3 x i32], align 4
|
||||
%y = alloca %"int[]", align 8
|
||||
%0 = bitcast [3 x i32]* %x to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @0 to i8*), i32 12, i1 false)
|
||||
%1 = bitcast [3 x i32]* %x to i32*
|
||||
%offset = getelementptr inbounds i32, i32* %1, i64 1
|
||||
%2 = insertvalue %"int[]" undef, i32* %offset, 0
|
||||
%3 = insertvalue %"int[]" %2, i64 1, 1
|
||||
store %"int[]" %3, %"int[]"* %y
|
||||
store %"int[]" %3, %"int[]"* %y, align 8
|
||||
|
||||
|
||||
@@ -6,12 +6,12 @@ func void test()
|
||||
|
||||
// #expect: slice_offset_neg_start.ll
|
||||
|
||||
%x = alloca [3 x i32]
|
||||
%y = alloca %"int[]"
|
||||
%0 = load [3 x i32], [3 x i32]* @0
|
||||
store [3 x i32] %0, [3 x i32]* %x
|
||||
%x = alloca [3 x i32], align 4
|
||||
%y = alloca %"int[]", align 8
|
||||
%0 = bitcast [3 x i32]* %x to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @0 to i8*), i32 12, i1 false)
|
||||
%1 = bitcast [3 x i32]* %x to i32*
|
||||
%offset = getelementptr inbounds i32, i32* %1, i64 1
|
||||
%2 = insertvalue %"int[]" undef, i32* %offset, 0
|
||||
%3 = insertvalue %"int[]" %2, i64 1, 1
|
||||
store %"int[]" %3, %"int[]"* %y
|
||||
store %"int[]" %3, %"int[]"* %y, align 8
|
||||
|
||||
@@ -6,12 +6,12 @@ func void test()
|
||||
|
||||
// #expect: slice_start.ll
|
||||
|
||||
%x = alloca [3 x i32]
|
||||
%y = alloca %"int[]"
|
||||
%0 = load [3 x i32], [3 x i32]* @0
|
||||
store [3 x i32] %0, [3 x i32]* %x
|
||||
%1 = bitcast [3 x i32]* %x to i32*
|
||||
%offset = getelementptr inbounds i32, i32* %1, i64 0
|
||||
%2 = insertvalue %"int[]" undef, i32* %offset, 0
|
||||
%3 = insertvalue %"int[]" %2, i64 3, 1
|
||||
store %"int[]" %3, %"int[]"* %y
|
||||
%x = alloca [3 x i32], align 4
|
||||
%y = alloca %"int[]", align 8
|
||||
%0 = bitcast [3 x i32]* %x to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x i32]* @0 to i8*), i32 12, i1 false)
|
||||
%1 = bitcast [3 x i32]* %x to i32*
|
||||
%offset = getelementptr inbounds i32, i32* %1, i64 0
|
||||
%2 = insertvalue %"int[]" undef, i32* %offset, 0
|
||||
%3 = insertvalue %"int[]" %2, i64 3, 1
|
||||
store %"int[]" %3, %"int[]"* %y, align 8
|
||||
|
||||
Reference in New Issue
Block a user