mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Fix where bitstructs in subarrays triggered the wrong lowering. Fixes #877
This commit is contained in:
@@ -61,22 +61,17 @@ entry:
|
||||
store i32 0, ptr %0, align 4
|
||||
store i32 33, ptr %foo2, align 4
|
||||
store ptr @.str, ptr %str, align 8
|
||||
%1 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 0
|
||||
store i32 1, ptr %1, align 4
|
||||
%2 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 1
|
||||
store i32 2, ptr %2, align 4
|
||||
%3 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 2
|
||||
store i32 3, ptr %3, align 4
|
||||
%4 = insertvalue %"int[]" undef, ptr %literal, 0
|
||||
%5 = insertvalue %"int[]" %4, i64 3, 1
|
||||
%6 = extractvalue %"int[]" %5, 1
|
||||
%not = icmp eq i64 %6, 0
|
||||
%7 = zext i1 %not to i8
|
||||
store i8 %7, ptr %x, align 1
|
||||
%8 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 0
|
||||
store i32 0, ptr %8, align 4
|
||||
%9 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 1
|
||||
store i32 0, ptr %9, align 4
|
||||
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %literal, ptr align 4 @.__const.1, i32 12, i1 false)
|
||||
%1 = insertvalue %"int[]" undef, ptr %literal, 0
|
||||
%2 = insertvalue %"int[]" %1, i64 3, 1
|
||||
%3 = extractvalue %"int[]" %2, 1
|
||||
%not = icmp eq i64 %3, 0
|
||||
%4 = zext i1 %not to i8
|
||||
store i8 %4, ptr %x, align 1
|
||||
%5 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 0
|
||||
store i32 0, ptr %5, align 4
|
||||
%6 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 1
|
||||
store i32 0, ptr %6, align 4
|
||||
call void @llvm.memset.p0.i64(ptr align 8 %z, i8 0, i64 8, i1 false)
|
||||
store %"int[]" zeroinitializer, ptr %sub, align 8
|
||||
store %"Bar[]" zeroinitializer, ptr %foo, align 8
|
||||
|
||||
@@ -37,7 +37,7 @@ fn int main()
|
||||
|
||||
@"$ct.statics.Baz" = linkonce global %.introspect { i8 11, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
|
||||
@"$ct.statics.Bar" = linkonce global %.introspect { i8 10, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
|
||||
@.taddr = private global [1 x %Bar] [%Bar { i32 1, i32 2 }], align 8
|
||||
@.__const = private unnamed_addr constant [1 x %Bar] [%Bar { i32 1, i32 2 }], align 4
|
||||
@test.c = internal unnamed_addr global %"Bar[]" { ptr @.taddr, i64 1 }, align 8
|
||||
@.str = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1
|
||||
|
||||
@@ -45,46 +45,32 @@ define void @statics.test() #0 {
|
||||
entry:
|
||||
%b = alloca %"Bar[]", align 8
|
||||
%literal = alloca [1 x %Bar], align 4
|
||||
%0 = getelementptr inbounds [1 x %Bar], ptr %literal, i64 0, i64 0
|
||||
%1 = getelementptr inbounds %Bar, ptr %0, i32 0, i32 0
|
||||
store i32 1, ptr %1, align 4
|
||||
%2 = getelementptr inbounds %Bar, ptr %0, i32 0, i32 1
|
||||
store i32 2, ptr %2, align 4
|
||||
%3 = insertvalue %"Bar[]" undef, ptr %literal, 0
|
||||
%4 = insertvalue %"Bar[]" %3, i64 1, 1
|
||||
store %"Bar[]" %4, ptr %b, align 8
|
||||
%5 = getelementptr inbounds %"Bar[]", ptr %b, i32 0, i32 0
|
||||
%6 = load ptr, ptr %5, align 8
|
||||
%ptroffset = getelementptr inbounds %Bar, ptr %6, i64 0
|
||||
%7 = getelementptr inbounds %Bar, ptr %ptroffset, i32 0, i32 1
|
||||
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %literal, ptr align 4 @.__const, i32 8, i1 false)
|
||||
%0 = insertvalue %"Bar[]" undef, ptr %literal, 0
|
||||
%1 = insertvalue %"Bar[]" %0, i64 1, 1
|
||||
store %"Bar[]" %1, ptr %b, align 8
|
||||
%2 = getelementptr inbounds %"Bar[]", ptr %b, i32 0, i32 0
|
||||
%3 = load ptr, ptr %2, align 8
|
||||
%ptroffset = getelementptr inbounds %Bar, ptr %3, i64 0
|
||||
%4 = getelementptr inbounds %Bar, ptr %ptroffset, i32 0, i32 1
|
||||
%5 = load i32, ptr %4, align 4
|
||||
%6 = load ptr, ptr @test.c, align 8
|
||||
%ptroffset1 = getelementptr inbounds %Bar, ptr %6, i64 0
|
||||
%7 = getelementptr inbounds %Bar, ptr %ptroffset1, i32 0, i32 1
|
||||
%8 = load i32, ptr %7, align 4
|
||||
%9 = load ptr, ptr @test.c, align 8
|
||||
%ptroffset1 = getelementptr inbounds %Bar, ptr %9, i64 0
|
||||
%10 = getelementptr inbounds %Bar, ptr %ptroffset1, i32 0, i32 1
|
||||
%11 = load i32, ptr %10, align 4
|
||||
%12 = call i32 (ptr, ...) @printf(ptr @.str, i32 %8, i32 %11)
|
||||
%13 = getelementptr inbounds %"Bar[]", ptr %b, i32 0, i32 0
|
||||
%14 = load ptr, ptr %13, align 8
|
||||
%ptroffset2 = getelementptr inbounds %Bar, ptr %14, i64 0
|
||||
%15 = getelementptr inbounds %Bar, ptr %ptroffset2, i32 0, i32 1
|
||||
%9 = call i32 (ptr, ...) @printf(ptr @.str, i32 %5, i32 %8)
|
||||
%10 = getelementptr inbounds %"Bar[]", ptr %b, i32 0, i32 0
|
||||
%11 = load ptr, ptr %10, align 8
|
||||
%ptroffset2 = getelementptr inbounds %Bar, ptr %11, i64 0
|
||||
%12 = getelementptr inbounds %Bar, ptr %ptroffset2, i32 0, i32 1
|
||||
%13 = load i32, ptr %12, align 4
|
||||
%add = add i32 %13, 1
|
||||
store i32 %add, ptr %12, align 4
|
||||
%14 = load ptr, ptr @test.c, align 8
|
||||
%ptroffset3 = getelementptr inbounds %Bar, ptr %14, i64 0
|
||||
%15 = getelementptr inbounds %Bar, ptr %ptroffset3, i32 0, i32 1
|
||||
%16 = load i32, ptr %15, align 4
|
||||
%add = add i32 %16, 1
|
||||
store i32 %add, ptr %15, align 4
|
||||
%17 = load ptr, ptr @test.c, align 8
|
||||
%ptroffset3 = getelementptr inbounds %Bar, ptr %17, i64 0
|
||||
%18 = getelementptr inbounds %Bar, ptr %ptroffset3, i32 0, i32 1
|
||||
%19 = load i32, ptr %18, align 4
|
||||
%add4 = add i32 %19, 1
|
||||
store i32 %add4, ptr %18, align 4
|
||||
%add4 = add i32 %16, 1
|
||||
store i32 %add4, ptr %15, align 4
|
||||
ret void
|
||||
}
|
||||
|
||||
define i32 @main() #0 {
|
||||
entry:
|
||||
call void @statics.test()
|
||||
call void @statics.test()
|
||||
call void @statics.test()
|
||||
ret i32 1
|
||||
}
|
||||
|
||||
declare i32 @printf(ptr, ...)
|
||||
@@ -60,12 +60,12 @@ fn int main()
|
||||
@.taddr.4 = private global [2 x i32] [i32 3, i32 4], align 4
|
||||
@subarrays.fofeo = local_unnamed_addr global ptr @.taddr.4, align 8
|
||||
@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
|
||||
@.str.5 = private unnamed_addr constant [7 x i8] c"Start:\00", align 1
|
||||
@.str.6 = private unnamed_addr constant [26 x i8] c"X len: %d mid element %d\0A\00", align 1
|
||||
@.str.7 = private unnamed_addr constant [18 x i8] c"Y mid element %d\0A\00", align 1
|
||||
@.str.8 = private unnamed_addr constant [25 x i8] c"Fofeo second element %d\0A\00", align 1
|
||||
@.__const = private unnamed_addr constant { i32, [4 x i8] } { i32 1, [4 x i8] undef }, align 8
|
||||
@.str.9 = private unnamed_addr constant [3 x i8] c"Ok\00", align 1
|
||||
@.str.6 = private unnamed_addr constant [7 x i8] c"Start:\00", align 1
|
||||
@.str.7 = private unnamed_addr constant [26 x i8] c"X len: %d mid element %d\0A\00", align 1
|
||||
@.str.8 = private unnamed_addr constant [18 x i8] c"Y mid element %d\0A\00", align 1
|
||||
@.str.9 = private unnamed_addr constant [25 x i8] c"Fofeo second element %d\0A\00", align 1
|
||||
@.__const.10 = private unnamed_addr constant { i32, [4 x i8] } { i32 1, [4 x i8] undef }, align 8
|
||||
@.str.12 = private unnamed_addr constant [3 x i8] c"Ok\00", align 1
|
||||
|
||||
; Function Attrs: nounwind
|
||||
define i32 @main() #0 {
|
||||
@@ -96,74 +96,59 @@ entry:
|
||||
%2 = getelementptr inbounds %Bar, ptr %ptroffset1, i32 0, i32 0
|
||||
%3 = load i32, ptr %2, align 4
|
||||
%4 = call i32 (ptr, ...) @printf(ptr @.str, i32 %3)
|
||||
%5 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 0
|
||||
store i32 1, ptr %5, align 4
|
||||
%6 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 1
|
||||
store i32 2, ptr %6, align 4
|
||||
%7 = getelementptr inbounds [3 x i32], ptr %literal, i64 0, i64 2
|
||||
store i32 3, ptr %7, align 4
|
||||
%8 = insertvalue %"int[]" undef, ptr %literal, 0
|
||||
%9 = insertvalue %"int[]" %8, i64 3, 1
|
||||
store %"int[]" %9, ptr %x, align 8
|
||||
%10 = getelementptr inbounds [3 x i32], ptr %literal2, i64 0, i64 0
|
||||
store i32 123, ptr %10, align 4
|
||||
%11 = getelementptr inbounds [3 x i32], ptr %literal2, i64 0, i64 1
|
||||
store i32 234, ptr %11, align 4
|
||||
%12 = getelementptr inbounds [3 x i32], ptr %literal2, i64 0, i64 2
|
||||
store i32 567, ptr %12, align 4
|
||||
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %literal, ptr align 4 @.__const, i32 12, i1 false)
|
||||
%5 = insertvalue %"int[]" undef, ptr %literal, 0
|
||||
%6 = insertvalue %"int[]" %5, i64 3, 1
|
||||
store %"int[]" %6, ptr %x, align 8
|
||||
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %literal2, ptr align 4 @.__const.5, i32 12, i1 false)
|
||||
store ptr %literal2, ptr %y, align 8
|
||||
%13 = call ptr @std.io.stdout()
|
||||
store ptr %13, ptr %result, align 8
|
||||
%14 = load ptr, ptr %result, align 8
|
||||
%15 = call i64 @std.io.File.printn(ptr %retparam, ptr %14, ptr @.str.5, i64 6)
|
||||
%16 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 1
|
||||
%17 = load i64, ptr %16, align 8
|
||||
%trunc = trunc i64 %17 to i32
|
||||
%18 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 0
|
||||
%19 = load ptr, ptr %18, align 8
|
||||
%ptroffset3 = getelementptr inbounds i32, ptr %19, i64 1
|
||||
%20 = load i32, ptr %ptroffset3, align 4
|
||||
%21 = call i32 (ptr, ...) @printf(ptr @.str.6, i32 %trunc, i32 %20)
|
||||
%22 = load ptr, ptr %y, align 8
|
||||
%ptroffset4 = getelementptr inbounds i32, ptr %22, i64 1
|
||||
%23 = load i32, ptr %ptroffset4, align 4
|
||||
%24 = call i32 (ptr, ...) @printf(ptr @.str.7, i32 %23)
|
||||
%25 = load ptr, ptr @subarrays.fofeo, align 8
|
||||
%ptroffset5 = getelementptr inbounds i32, ptr %25, i64 1
|
||||
%26 = load i32, ptr %ptroffset5, align 4
|
||||
%27 = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %26)
|
||||
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %ffe, ptr align 8 @.__const, i32 8, i1 false)
|
||||
%28 = getelementptr inbounds [1 x i32], ptr %azz, i64 0, i64 0
|
||||
store i32 0, ptr %28, align 4
|
||||
%29 = getelementptr inbounds [3 x i32], ptr %literal6, i64 0, i64 0
|
||||
store i32 1, ptr %29, align 4
|
||||
%30 = getelementptr inbounds [3 x i32], ptr %literal6, i64 0, i64 1
|
||||
store i32 2, ptr %30, align 4
|
||||
%31 = getelementptr inbounds [3 x i32], ptr %literal6, i64 0, i64 2
|
||||
store i32 3, ptr %31, align 4
|
||||
%32 = insertvalue %"int[]" undef, ptr %literal6, 0
|
||||
%33 = insertvalue %"int[]" %32, i64 3, 1
|
||||
%34 = extractvalue %"int[]" %33, 1
|
||||
%not = icmp eq i64 %34, 0
|
||||
%35 = zext i1 %not to i8
|
||||
store i8 %35, ptr %xy, align 1
|
||||
%36 = load i8, ptr %xy, align 1
|
||||
%37 = trunc i8 %36 to i1
|
||||
%not7 = xor i1 %37, true
|
||||
%7 = call ptr @std.io.stdout()
|
||||
store ptr %7, ptr %result, align 8
|
||||
%8 = load ptr, ptr %result, align 8
|
||||
%9 = call i64 @std.io.File.printn(ptr %retparam, ptr %8, ptr @.str.6, i64 6)
|
||||
%10 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 1
|
||||
%11 = load i64, ptr %10, align 8
|
||||
%trunc = trunc i64 %11 to i32
|
||||
%12 = getelementptr inbounds %"int[]", ptr %x, i32 0, i32 0
|
||||
%13 = load ptr, ptr %12, align 8
|
||||
%ptroffset3 = getelementptr inbounds i32, ptr %13, i64 1
|
||||
%14 = load i32, ptr %ptroffset3, align 4
|
||||
%15 = call i32 (ptr, ...) @printf(ptr @.str.7, i32 %trunc, i32 %14)
|
||||
%16 = load ptr, ptr %y, align 8
|
||||
%ptroffset4 = getelementptr inbounds i32, ptr %16, i64 1
|
||||
%17 = load i32, ptr %ptroffset4, align 4
|
||||
%18 = call i32 (ptr, ...) @printf(ptr @.str.8, i32 %17)
|
||||
%19 = load ptr, ptr @subarrays.fofeo, align 8
|
||||
%ptroffset5 = getelementptr inbounds i32, ptr %19, i64 1
|
||||
%20 = load i32, ptr %ptroffset5, align 4
|
||||
%21 = call i32 (ptr, ...) @printf(ptr @.str.9, i32 %20)
|
||||
call void @llvm.memcpy.p0.p0.i32(ptr align 8 %ffe, ptr align 8 @.__const.10, i32 8, i1 false)
|
||||
%22 = getelementptr inbounds [1 x i32], ptr %azz, i64 0, i64 0
|
||||
store i32 0, ptr %22, align 4
|
||||
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %literal6, ptr align 4 @.__const.11, i32 12, i1 false)
|
||||
%23 = insertvalue %"int[]" undef, ptr %literal6, 0
|
||||
%24 = insertvalue %"int[]" %23, i64 3, 1
|
||||
%25 = extractvalue %"int[]" %24, 1
|
||||
%not = icmp eq i64 %25, 0
|
||||
%26 = zext i1 %not to i8
|
||||
store i8 %26, ptr %xy, align 1
|
||||
%27 = load i8, ptr %xy, align 1
|
||||
%28 = trunc i8 %27 to i1
|
||||
%not7 = xor i1 %28, true
|
||||
br i1 %not7, label %if.then, label %if.exit
|
||||
|
||||
if.then: ; preds = %entry
|
||||
%38 = call ptr @std.io.stdout()
|
||||
store ptr %38, ptr %result9, align 8
|
||||
%39 = load ptr, ptr %result9, align 8
|
||||
%40 = call i64 @std.io.File.printn(ptr %retparam8, ptr %39, ptr @.str.9, i64 2)
|
||||
%29 = call ptr @std.io.stdout()
|
||||
store ptr %29, ptr %result9, align 8
|
||||
%30 = load ptr, ptr %result9, align 8
|
||||
%31 = call i64 @std.io.File.printn(ptr %retparam8, ptr %30, ptr @.str.12, i64 2)
|
||||
br label %if.exit
|
||||
|
||||
if.exit: ; preds = %if.then, %entry
|
||||
%41 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 0
|
||||
store i32 0, ptr %41, align 4
|
||||
%42 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 1
|
||||
store i32 0, ptr %42, align 4
|
||||
%32 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 0
|
||||
store i32 0, ptr %32, align 4
|
||||
%33 = getelementptr inbounds %Bar, ptr %b, i32 0, i32 1
|
||||
store i32 0, ptr %33, align 4
|
||||
call void @llvm.memset.p0.i64(ptr align 8 %z, i8 0, i64 8, i1 false)
|
||||
store %"int[]" zeroinitializer, ptr %sub, align 8
|
||||
store %"Bar[]" zeroinitializer, ptr %foo, align 8
|
||||
|
||||
Reference in New Issue
Block a user