Fix where bitstructs in subarrays triggered the wrong lowering. Fixes #877

This commit is contained in:
Christoffer Lerno
2023-07-23 20:18:33 +02:00
parent afb902d792
commit 45d1b1d671
33 changed files with 2171 additions and 1770 deletions

View File

@@ -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

View File

@@ -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, ...)

View File

@@ -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