================
@@ -0,0 +1,127 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o 
%t.cir
+// RUN: FileCheck --input-file=%t.cir %s --check-prefix=CIR
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o 
%t-cir.ll
+// RUN: FileCheck --input-file=%t-cir.ll %s --check-prefix=LLVM
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll
+// RUN: FileCheck --input-file=%t.ll %s --check-prefix=OGCG
+
+int f(int x) {
+  static const void *tbl[] = {&&L1, &&L2};
+  goto *tbl[x];
+L1:
+  return 1;
+L2:
+  return 2;
+}
+
+// A appears twice in g's table; both occurrences are kept as indirect-branch
+// successors, matching classic codegen.
+int g(int x) {
+  static const void *tbl[] = {&&A, &&A, &&B};
+  goto *tbl[x];
+A:
+  return 1;
+B:
+  return 2;
+}
+
+// A constant label address with no indirect goto reaching it: the 
indirect-goto
+// block is created but has no predecessors, so it is left poisoned.
+int h(int x) {
+  static const void *tbl[] = {&&L1};
+  (void)tbl;
+  return x;
+L1:
+  return 0;
+}
+
+// A's address comes from a constant table, B's from a runtime block-address 
op;
+// both feed the same indirect branch.
+int m(int sel) {
+  static const void *ctbl[] = {&&A2};
+  void *p = &&B2;
+  void *t = (void *)ctbl[0];
+  void *dest = sel ? t : p;
+  goto *dest;
+A2:
+  return 1;
+B2:
+  return 2;
+}
+
+// CIR-DAG: cir.global "private" internal dso_local @f.tbl = 
#cir.const_array<[#cir.block_addr_info<@f, "L1"> : !cir.ptr<!void>, 
#cir.block_addr_info<@f, "L2"> : !cir.ptr<!void>]> : !cir.array<!cir.ptr<!void> 
x 2>
+// CIR-DAG: cir.global "private" internal dso_local @g.tbl = 
#cir.const_array<[#cir.block_addr_info<@g, "A"> : !cir.ptr<!void>, 
#cir.block_addr_info<@g, "A"> : !cir.ptr<!void>, #cir.block_addr_info<@g, "B"> 
: !cir.ptr<!void>]> : !cir.array<!cir.ptr<!void> x 3>
+// CIR-DAG: cir.global "private" internal dso_local @h.tbl = 
#cir.const_array<[#cir.block_addr_info<@h, "L1"> : !cir.ptr<!void>]> : 
!cir.array<!cir.ptr<!void> x 1>
+// CIR-DAG: cir.global "private" internal dso_local @m.ctbl = 
#cir.const_array<[#cir.block_addr_info<@m, "A2"> : !cir.ptr<!void>]> : 
!cir.array<!cir.ptr<!void> x 1>
+
+// CIR: cir.func {{.*}} @f
----------------
andykaylor wrote:

Can you move these checks to below the corresponding functions and group them 
by function rather than having all the CIR checks, followed by all the LLVM 
checks, etc?

https://github.com/llvm/llvm-project/pull/201644
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to