From cbb58d28f644068885917f6175473438a0b3db7d Mon Sep 17 00:00:00 2001 From: Schrodinger ZHU Yifan Date: Thu, 14 Nov 2024 22:22:03 -0500 Subject: [PATCH 1/4] [gccjit] workaround union access_field problem --- test/compile/union.mlir | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/test/compile/union.mlir b/test/compile/union.mlir index 9cf63c9..dba0127 100644 --- a/test/compile/union.mlir +++ b/test/compile/union.mlir @@ -6,7 +6,7 @@ #gccjit.field<"genius" !gccjit.int> }> -!struct2 = !gccjit.struct<"QuaticCat" { +!struct2 = !gccjit.struct<"QuarticCat" { #gccjit.field<"excellent" !gccjit.fp>, #gccjit.field<"magnificent" !gccjit.int> }> @@ -27,7 +27,7 @@ #int = #gccjit.int<-1> : !gccjit.int module attributes { gccjit.opt_level = #gccjit.opt_level, gccjit.allow_unreachable = true } { -gccjit.global exported @union_data init { +gccjit.global internal @union_data init { %e = gccjit.const #float %m = gccjit.const #int %qc = gccjit.new_struct [0, 1] [%e , %m] : (!gccjit.fp, !gccjit.int) -> !struct2 @@ -38,30 +38,31 @@ gccjit.global exported @union_data init { gccjit.func exported @main() -> !gccjit.int { ^entry: %0 = gccjit.get_global @union_data : !gccjit.lvalue - // CHECK: %{{[0-9]+}} = union_data.professional.genius; - %1 = gccjit.access_field %0[0] : !gccjit.lvalue -> !gccjit.lvalue - %2 = gccjit.access_field %1[1] : !gccjit.lvalue -> !gccjit.lvalue> - %3 = gccjit.as_rvalue %2 : !gccjit.lvalue> to !gccjit.int + %rv = gccjit.as_rvalue %0 : !gccjit.lvalue to !union + // CHECK: %[[CAST:[0-9]+]] = bitcast(%{{[0-9]+}}, struct Lancern); + %1 = gccjit.bitcast %rv : !union to !struct1 + // CHECK: %{{[0-9]+}} = %[[CAST]].genius; + %2 = gccjit.access_field %1[1] : !struct1 -> !gccjit.int %max = gccjit.const #gccjit.int<0xffffffffffffffff> : !gccjit.int - %eq = gccjit.compare eq (%3 : !gccjit.int, %max : !gccjit.int) : !gccjit.int + %eq = gccjit.compare eq (%2 : !gccjit.int, %max : !gccjit.int) : !gccjit.int gccjit.conditional (%eq : !gccjit.int), ^next, ^abort ^next: - // CHECK: %[[RV:[0-9]+]] = union_data._float; - %4 = gccjit.access_field %0[2] : !gccjit.lvalue -> !gccjit.lvalue - %5 = gccjit.as_rvalue %4 : !gccjit.lvalue to !struct3 + // CHECK: %[[RV:[0-9]+]] = bitcast(%{{[0-9]+}}, struct Float); + %rv2 = gccjit.access_field %rv[1] : !union -> !struct2 + %3 = gccjit.bitcast %rv2 : !struct2 to !struct3 // CHECK: %{{[0-9]+}} = %[[RV]].sign:1; - %6 = gccjit.access_field %5[2] : !struct3 -> !gccjit.int // sign + %4 = gccjit.access_field %3[2] : !struct3 -> !gccjit.int // sign // CHECK: %{{[0-9]+}} = %[[RV]].exp:8; - %7 = gccjit.access_field %5[1] : !struct3 -> !gccjit.int // exp + %5 = gccjit.access_field %3[1] : !struct3 -> !gccjit.int // exp // CHECK: %{{[0-9]+}} = %[[RV]].mant:23; - %8 = gccjit.access_field %5[0] : !struct3 -> !gccjit.int // mant + %6 = gccjit.access_field %3[0] : !struct3 -> !gccjit.int // mant %c0 = gccjit.const #gccjit.int<0> : !gccjit.int %exp = gccjit.const #gccjit.int<124> : !gccjit.int %mant = gccjit.const #gccjit.int<2097152> : !gccjit.int - %eq0 = gccjit.compare eq (%6 : !gccjit.int, %c0 : !gccjit.int) : !gccjit.int - %eq1 = gccjit.compare eq (%7 : !gccjit.int, %exp : !gccjit.int) : !gccjit.int - %eq2 = gccjit.compare eq (%8 : !gccjit.int, %mant : !gccjit.int) : !gccjit.int + %eq0 = gccjit.compare eq (%4 : !gccjit.int, %c0 : !gccjit.int) : !gccjit.int + %eq1 = gccjit.compare eq (%5 : !gccjit.int, %exp : !gccjit.int) : !gccjit.int + %eq2 = gccjit.compare eq (%6 : !gccjit.int, %mant : !gccjit.int) : !gccjit.int %and0 = gccjit.binary logical_and (%eq0 : !gccjit.int, %eq1 : !gccjit.int) : !gccjit.int %and1 = gccjit.binary logical_and (%and0 : !gccjit.int, %eq2 : !gccjit.int) : !gccjit.int gccjit.conditional (%and1 : !gccjit.int), ^return, ^abort From 7aaaca53b80a29018f28278383b8cc8c096ba7a0 Mon Sep 17 00:00:00 2001 From: Schrodinger ZHU Yifan Date: Thu, 14 Nov 2024 22:28:46 -0500 Subject: [PATCH 2/4] workaround large integer error for now --- test/compile/union.mlir | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/compile/union.mlir b/test/compile/union.mlir index dba0127..6439e15 100644 --- a/test/compile/union.mlir +++ b/test/compile/union.mlir @@ -43,7 +43,7 @@ gccjit.func exported @main() -> !gccjit.int { %1 = gccjit.bitcast %rv : !union to !struct1 // CHECK: %{{[0-9]+}} = %[[CAST]].genius; %2 = gccjit.access_field %1[1] : !struct1 -> !gccjit.int - %max = gccjit.const #gccjit.int<0xffffffffffffffff> : !gccjit.int + %max = gccjit.const #gccjit.int<-1> : !gccjit.int %eq = gccjit.compare eq (%2 : !gccjit.int, %max : !gccjit.int) : !gccjit.int gccjit.conditional (%eq : !gccjit.int), ^next, ^abort From debe43235adb69b2d4fc5a094929e6a6ca2a8d96 Mon Sep 17 00:00:00 2001 From: Schrodinger ZHU Yifan Date: Fri, 15 Nov 2024 10:47:37 -0500 Subject: [PATCH 3/4] [gccjit] remove bitfield test from union test --- test/compile/union.mlir | 61 ++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 40 deletions(-) diff --git a/test/compile/union.mlir b/test/compile/union.mlir index 6439e15..6255179 100644 --- a/test/compile/union.mlir +++ b/test/compile/union.mlir @@ -1,71 +1,52 @@ // RUN: %gccjit-translate -o %t.gimple %s -mlir-to-gccjit-gimple // RUN: %filecheck --input-file=%t.gimple %s // RUN: %gccjit-translate -o %t.exe %s -mlir-to-gccjit-executable && chmod +x %t.exe && %t.exe -!struct1 = !gccjit.struct<"Lancern" { +!struct0 = !gccjit.struct<"Lancern" { #gccjit.field<"professional" !gccjit.fp>, #gccjit.field<"genius" !gccjit.int> }> -!struct2 = !gccjit.struct<"QuarticCat" { +!struct1 = !gccjit.struct<"QuarticCat" { #gccjit.field<"excellent" !gccjit.fp>, #gccjit.field<"magnificent" !gccjit.int> }> -!struct3 = !gccjit.struct<"Float" { - #gccjit.field<"mant" !gccjit.int : 23>, - #gccjit.field<"exp" !gccjit.int : 8>, - #gccjit.field<"sign" !gccjit.int : 1> -}> - !union = !gccjit.union<"Union" { - #gccjit.field<"professional" !struct1>, - #gccjit.field<"genius" !struct2>, - #gccjit.field<"_float" !struct3> + #gccjit.field<"professional" !struct0>, + #gccjit.field<"genius" !struct1>, + #gccjit.field<"data" !gccjit.int> }> #float = #gccjit.float<0.15625> : !gccjit.fp #int = #gccjit.int<-1> : !gccjit.int module attributes { gccjit.opt_level = #gccjit.opt_level, gccjit.allow_unreachable = true } { -gccjit.global internal @union_data init { +gccjit.global exported @union_data init { %e = gccjit.const #float %m = gccjit.const #int - %qc = gccjit.new_struct [0, 1] [%e , %m] : (!gccjit.fp, !gccjit.int) -> !struct2 - %un = gccjit.new_union %qc at 1 : !struct2, !union + %qc = gccjit.new_struct [0, 1] [%e , %m] : (!gccjit.fp, !gccjit.int) -> !struct1 + %un = gccjit.new_union %qc at 1 : !struct1, !union gccjit.return %un : !union } : !gccjit.lvalue gccjit.func exported @main() -> !gccjit.int { ^entry: %0 = gccjit.get_global @union_data : !gccjit.lvalue - %rv = gccjit.as_rvalue %0 : !gccjit.lvalue to !union - // CHECK: %[[CAST:[0-9]+]] = bitcast(%{{[0-9]+}}, struct Lancern); - %1 = gccjit.bitcast %rv : !union to !struct1 - // CHECK: %{{[0-9]+}} = %[[CAST]].genius; - %2 = gccjit.access_field %1[1] : !struct1 -> !gccjit.int - %max = gccjit.const #gccjit.int<-1> : !gccjit.int - %eq = gccjit.compare eq (%2 : !gccjit.int, %max : !gccjit.int) : !gccjit.int - gccjit.conditional (%eq : !gccjit.int), ^next, ^abort + // CHECK: %{{[0-9]+}} = union_data.professional.genius; + %1 = gccjit.access_field %0[0] : !gccjit.lvalue -> !gccjit.lvalue + %2 = gccjit.access_field %1[1] : !gccjit.lvalue -> !gccjit.lvalue> + %3 = gccjit.as_rvalue %2 : !gccjit.lvalue> to !gccjit.int + %max = gccjit.const #gccjit.int<0xffffffffffffffff> : !gccjit.int + %eq0 = gccjit.compare eq (%3 : !gccjit.int, %max : !gccjit.int) : !gccjit.int + gccjit.conditional (%eq0 : !gccjit.int), ^next, ^abort ^next: - // CHECK: %[[RV:[0-9]+]] = bitcast(%{{[0-9]+}}, struct Float); - %rv2 = gccjit.access_field %rv[1] : !union -> !struct2 - %3 = gccjit.bitcast %rv2 : !struct2 to !struct3 - // CHECK: %{{[0-9]+}} = %[[RV]].sign:1; - %4 = gccjit.access_field %3[2] : !struct3 -> !gccjit.int // sign - // CHECK: %{{[0-9]+}} = %[[RV]].exp:8; - %5 = gccjit.access_field %3[1] : !struct3 -> !gccjit.int // exp - // CHECK: %{{[0-9]+}} = %[[RV]].mant:23; - %6 = gccjit.access_field %3[0] : !struct3 -> !gccjit.int // mant - %c0 = gccjit.const #gccjit.int<0> : !gccjit.int - %exp = gccjit.const #gccjit.int<124> : !gccjit.int - %mant = gccjit.const #gccjit.int<2097152> : !gccjit.int - %eq0 = gccjit.compare eq (%4 : !gccjit.int, %c0 : !gccjit.int) : !gccjit.int - %eq1 = gccjit.compare eq (%5 : !gccjit.int, %exp : !gccjit.int) : !gccjit.int - %eq2 = gccjit.compare eq (%6 : !gccjit.int, %mant : !gccjit.int) : !gccjit.int - %and0 = gccjit.binary logical_and (%eq0 : !gccjit.int, %eq1 : !gccjit.int) : !gccjit.int - %and1 = gccjit.binary logical_and (%and0 : !gccjit.int, %eq2 : !gccjit.int) : !gccjit.int - gccjit.conditional (%and1 : !gccjit.int), ^return, ^abort + // CHECK: %[[RV:[0-9]+]] = union_data.data; + %4 = gccjit.access_field %0[2] : !gccjit.lvalue -> !gccjit.lvalue> + %5 = gccjit.as_rvalue %4 : !gccjit.lvalue> to !gccjit.int + %target = gccjit.const #gccjit.int<1042284544> : !gccjit.int + %eq1 = gccjit.compare eq (%5 : !gccjit.int, %target : !gccjit.int) : !gccjit.int + gccjit.conditional (%eq1 : !gccjit.int), ^return, ^abort ^abort: gccjit.call builtin @__builtin_trap() : () -> !gccjit.void From 976077e37d4a0812f4b03ebc8239c2c02eb4eb8e Mon Sep 17 00:00:00 2001 From: Schrodinger ZHU Yifan Date: Fri, 15 Nov 2024 10:49:29 -0500 Subject: [PATCH 4/4] [gccjit] make symbol internal --- test/compile/union.mlir | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/compile/union.mlir b/test/compile/union.mlir index 6255179..b895d73 100644 --- a/test/compile/union.mlir +++ b/test/compile/union.mlir @@ -21,7 +21,7 @@ #int = #gccjit.int<-1> : !gccjit.int module attributes { gccjit.opt_level = #gccjit.opt_level, gccjit.allow_unreachable = true } { -gccjit.global exported @union_data init { +gccjit.global internal @union_data init { %e = gccjit.const #float %m = gccjit.const #int %qc = gccjit.new_struct [0, 1] [%e , %m] : (!gccjit.fp, !gccjit.int) -> !struct1