Skip to content

Commit

Permalink
[gccjit] workaround union access_field problem (#31)
Browse files Browse the repository at this point in the history
* [gccjit] workaround union access_field problem

* workaround large integer error for now

* [gccjit] remove bitfield test from union test

* [gccjit] make symbol internal
  • Loading branch information
SchrodingerZhu authored Nov 15, 2024
1 parent 5e7854d commit 8adfa0d
Showing 1 changed file with 18 additions and 36 deletions.
54 changes: 18 additions & 36 deletions test/compile/union.mlir
Original file line number Diff line number Diff line change
@@ -1,70 +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<float>>,
#gccjit.field<"genius" !gccjit.int<unsigned long>>
}>

!struct2 = !gccjit.struct<"QuaticCat" {
!struct1 = !gccjit.struct<"QuarticCat" {
#gccjit.field<"excellent" !gccjit.fp<float>>,
#gccjit.field<"magnificent" !gccjit.int<long>>
}>

!struct3 = !gccjit.struct<"Float" {
#gccjit.field<"mant" !gccjit.int<uint32_t> : 23>,
#gccjit.field<"exp" !gccjit.int<uint32_t> : 8>,
#gccjit.field<"sign" !gccjit.int<uint32_t> : 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<int>>
}>

#float = #gccjit.float<0.15625> : !gccjit.fp<float>
#int = #gccjit.int<-1> : !gccjit.int<long>
module attributes { gccjit.opt_level = #gccjit.opt_level<O3>, 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<float>, !gccjit.int<long>) -> !struct2
%un = gccjit.new_union %qc at 1 : !struct2, !union
%qc = gccjit.new_struct [0, 1] [%e , %m] : (!gccjit.fp<float>, !gccjit.int<long>) -> !struct1
%un = gccjit.new_union %qc at 1 : !struct1, !union
gccjit.return %un : !union
} : !gccjit.lvalue<!union>

gccjit.func exported @main() -> !gccjit.int<int> {
^entry:
%0 = gccjit.get_global @union_data : !gccjit.lvalue<!union>
// CHECK: %{{[0-9]+}} = union_data.professional.genius;
%1 = gccjit.access_field %0[0] : !gccjit.lvalue<!union> -> !gccjit.lvalue<!struct1>
%2 = gccjit.access_field %1[1] : !gccjit.lvalue<!struct1> -> !gccjit.lvalue<!gccjit.int<unsigned long>>
%1 = gccjit.access_field %0[0] : !gccjit.lvalue<!union> -> !gccjit.lvalue<!struct0>
%2 = gccjit.access_field %1[1] : !gccjit.lvalue<!struct0> -> !gccjit.lvalue<!gccjit.int<unsigned long>>
%3 = gccjit.as_rvalue %2 : !gccjit.lvalue<!gccjit.int<unsigned long>> to !gccjit.int<unsigned long>
%max = gccjit.const #gccjit.int<0xffffffffffffffff> : !gccjit.int<unsigned long>
%eq = gccjit.compare eq (%3 : !gccjit.int<unsigned long>, %max : !gccjit.int<unsigned long>) : !gccjit.int<bool>
gccjit.conditional (%eq : !gccjit.int<bool>), ^next, ^abort
%eq0 = gccjit.compare eq (%3 : !gccjit.int<unsigned long>, %max : !gccjit.int<unsigned long>) : !gccjit.int<bool>
gccjit.conditional (%eq0 : !gccjit.int<bool>), ^next, ^abort

^next:
// CHECK: %[[RV:[0-9]+]] = union_data._float;
%4 = gccjit.access_field %0[2] : !gccjit.lvalue<!union> -> !gccjit.lvalue<!struct3>
%5 = gccjit.as_rvalue %4 : !gccjit.lvalue<!struct3> to !struct3
// CHECK: %{{[0-9]+}} = %[[RV]].sign:1;
%6 = gccjit.access_field %5[2] : !struct3 -> !gccjit.int<uint32_t> // sign
// CHECK: %{{[0-9]+}} = %[[RV]].exp:8;
%7 = gccjit.access_field %5[1] : !struct3 -> !gccjit.int<uint32_t> // exp
// CHECK: %{{[0-9]+}} = %[[RV]].mant:23;
%8 = gccjit.access_field %5[0] : !struct3 -> !gccjit.int<uint32_t> // mant
%c0 = gccjit.const #gccjit.int<0> : !gccjit.int<uint32_t>
%exp = gccjit.const #gccjit.int<124> : !gccjit.int<uint32_t>
%mant = gccjit.const #gccjit.int<2097152> : !gccjit.int<uint32_t>
%eq0 = gccjit.compare eq (%6 : !gccjit.int<uint32_t>, %c0 : !gccjit.int<uint32_t>) : !gccjit.int<bool>
%eq1 = gccjit.compare eq (%7 : !gccjit.int<uint32_t>, %exp : !gccjit.int<uint32_t>) : !gccjit.int<bool>
%eq2 = gccjit.compare eq (%8 : !gccjit.int<uint32_t>, %mant : !gccjit.int<uint32_t>) : !gccjit.int<bool>
%and0 = gccjit.binary logical_and (%eq0 : !gccjit.int<bool>, %eq1 : !gccjit.int<bool>) : !gccjit.int<bool>
%and1 = gccjit.binary logical_and (%and0 : !gccjit.int<bool>, %eq2 : !gccjit.int<bool>) : !gccjit.int<bool>
gccjit.conditional (%and1 : !gccjit.int<bool>), ^return, ^abort
// CHECK: %[[RV:[0-9]+]] = union_data.data;
%4 = gccjit.access_field %0[2] : !gccjit.lvalue<!union> -> !gccjit.lvalue<!gccjit.int<int>>
%5 = gccjit.as_rvalue %4 : !gccjit.lvalue<!gccjit.int<int>> to !gccjit.int<int>
%target = gccjit.const #gccjit.int<1042284544> : !gccjit.int<int>
%eq1 = gccjit.compare eq (%5 : !gccjit.int<int>, %target : !gccjit.int<int>) : !gccjit.int<bool>
gccjit.conditional (%eq1 : !gccjit.int<bool>), ^return, ^abort

^abort:
gccjit.call builtin @__builtin_trap() : () -> !gccjit.void
Expand Down

0 comments on commit 8adfa0d

Please sign in to comment.