aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernd.schmidt@analog.com>2009-09-07 15:13:40 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2009-09-07 15:13:40 +0000
commit8ff7f8241579ba8823310c4f05e267f8a24951a2 (patch)
treef980a018af60905eeae9faae47978b3508541206
parent3beb864c19b34fc0e4dcfdc12e65f4b4a3eeddce (diff)
downloadgcc-8ff7f8241579ba8823310c4f05e267f8a24951a2.zip
gcc-8ff7f8241579ba8823310c4f05e267f8a24951a2.tar.gz
gcc-8ff7f8241579ba8823310c4f05e267f8a24951a2.tar.bz2
bfin.c (bfin_optimize_loop): When creating a new basic block, ensure it has an exit edge.
gcc/ * config/bfin/bfin.c (bfin_optimize_loop): When creating a new basic block, ensure it has an exit edge. Emit a barrier after a jump. gcc/testsuite/ * gcc.c-torture/compile/20090907-1.c: New test. From-SVN: r151479
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/bfin/bfin.c6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20090907-1.c84
4 files changed, 98 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 686e665..20a5e68 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2009-09-07 Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * config/bfin/bfin.c (bfin_optimize_loop): When creating a new basic
+ block, ensure it has an exit edge. Emit a barrier after a jump.
+
2009-09-07 Nick Clifton <nickc@redhat.com>
* gcc.c (this_is_linker_script): New variable. Like
diff --git a/gcc/config/bfin/bfin.c b/gcc/config/bfin/bfin.c
index ebcd825..29c0032 100644
--- a/gcc/config/bfin/bfin.c
+++ b/gcc/config/bfin/bfin.c
@@ -4185,7 +4185,10 @@ bfin_optimize_loop (loop_info loop)
seq_end = emit_insn (copy_rtx (PATTERN (last_insn)));
}
else
- seq_end = emit_jump_insn (gen_jump (label));
+ {
+ emit_jump_insn (gen_jump (label));
+ seq_end = emit_barrier ();
+ }
}
seq = get_insns ();
@@ -4233,6 +4236,7 @@ bfin_optimize_loop (loop_info loop)
else
redirect_edge_succ (e, new_bb);
}
+ e = make_edge (new_bb, loop->head, 0);
}
delete_insn (loop->loop_end);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 567e58c..bdd1391 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2009-09-07 Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * gcc.c-torture/compile/20090907-1.c: New test.
+
2009-09-06 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/41241
diff --git a/gcc/testsuite/gcc.c-torture/compile/20090907-1.c b/gcc/testsuite/gcc.c-torture/compile/20090907-1.c
new file mode 100644
index 0000000..907574c
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20090907-1.c
@@ -0,0 +1,84 @@
+struct platform_device;
+typedef unsigned long __kernel_size_t;
+typedef unsigned short __u16;
+typedef unsigned int __u32;
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef __kernel_size_t size_t;
+typedef __u32 uint32_t;
+static inline __attribute__ ((always_inline))
+uint32_t __attribute__ ((pure)) bfin_dspid (void)
+{
+ return ( {
+ uint32_t __v; __v;}
+ );
+}
+struct list_head {
+ struct list_head *next, *prev;
+};
+struct page {
+ union {
+ };
+ struct list_head lru;
+};
+struct device_driver {
+ const char *name;
+ struct module *owner;
+};
+struct fb_info {
+ struct device *dev;
+};
+struct platform_driver {
+ int (*probe) (struct platform_device *);
+ int (*remove) (struct platform_device *);
+ struct device_driver driver;
+};
+struct firmware {
+ size_t size;
+ const u8 *data;
+};
+struct metronomefb_par {
+ struct fb_info *info;
+};
+struct waveform_hdr {
+ u8 trc;
+};
+static u8 calc_cksum (int start, int end, u8 * mem)
+{
+ u8 tmp = 0;
+ int i;
+ for (i = start; i < end; i++)
+ tmp += mem[i];
+ return tmp;
+}
+extern struct waveform_hdr *wfm_hdr;
+extern int wmta;
+
+static int
+load_waveform (u8 * mem, size_t size, int m, int t, struct metronomefb_par *par)
+{
+ int tta;
+ int trn = 0;
+ int i;
+ u8 cksum;
+ int cksum_idx;
+ struct device *dev = par->info->dev;
+ for (i = 0; i <= sizeof (*wfm_hdr) + wfm_hdr->trc; i++) {
+ if (mem[i] > t) {
+ trn = i - sizeof (*wfm_hdr) - 1;
+ }
+ }
+ tta = * (mem + wmta + m * 4) & 0x00FFFFFF;
+ cksum_idx = tta + trn * 4 + 3;
+ cksum = calc_cksum (cksum_idx - 3, cksum_idx, mem);
+ if (cksum != mem[cksum_idx]) {
+ abort();
+ }
+}
+extern struct firmware *fw_entry;
+extern struct metronomefb_par *par;
+
+int metronomefb_probe (struct platform_device *dev)
+{
+ return load_waveform ((u8 *) fw_entry->data, fw_entry->size, 3, 31, par);
+}