aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2016-11-21 16:15:21 +0100
committerSegher Boessenkool <segher@gcc.gnu.org>2016-11-21 16:15:21 +0100
commite51482c9c83406a928bef4c60f47a08a4232f379 (patch)
treedc529791ce39ccfa1bc4bac1e6ba33de64ce3770 /gcc
parente0e7aa34ab07f878b7a0abd89bd9544e9057e4f7 (diff)
downloadgcc-e51482c9c83406a928bef4c60f47a08a4232f379.zip
gcc-e51482c9c83406a928bef4c60f47a08a4232f379.tar.gz
gcc-e51482c9c83406a928bef4c60f47a08a4232f379.tar.bz2
Testcase for PR71785
gcc/testsuite/ PR rtl-optimization/71785 * gcc.target/powerpc/pr71785.c: New file. From-SVN: r242665
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/powerpc/pr71785.c52
2 files changed, 57 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 11f14f9..3f82737 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-21 Segher Boessenkool <segher@kernel.crashing.org>
+
+ PR rtl-optimization/71785
+ * gcc.target/powerpc/pr71785.c: New file.
+
2016-11-21 Bin Cheng <bin.cheng@arm.com>
PR testsuite/78114
diff --git a/gcc/testsuite/gcc.target/powerpc/pr71785.c b/gcc/testsuite/gcc.target/powerpc/pr71785.c
new file mode 100644
index 0000000..613dcd1
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr71785.c
@@ -0,0 +1,52 @@
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-not {\mb\M} } } */
+
+/* Check that all computed gotos in this testcase end up unfactored completely.
+ If some is not there will be a unconditional jump left; if all works fine,
+ all are gone. */
+
+typedef enum opcode
+{
+ OP_A,
+ OP_B,
+ OP_END
+} opcode;
+
+typedef struct op
+{
+ opcode opcode;
+ int arg;
+} op;
+
+extern void do_stuff_b(int arg);
+extern void do_stuff_c(int arg);
+
+extern int someglobal;
+
+void
+eval(op *op)
+{
+ static const void *dispatch_table[] = {
+ &&CASE_OP_A,
+ &&CASE_OP_B,
+ &&CASE_OP_C,
+ &&CASE_OP_END
+ };
+
+ goto *dispatch_table[op->opcode];
+CASE_OP_A:
+ someglobal++;
+ op++;
+ goto *dispatch_table[op->opcode];
+CASE_OP_B:
+ do_stuff_b(op->arg);
+ op++;
+ goto *dispatch_table[op->opcode];
+CASE_OP_C:
+ do_stuff_c(op->arg);
+ op++;
+ goto *dispatch_table[op->opcode];
+CASE_OP_END:
+ return;
+}