tree-ssa-operands.c (add_vars_for_offset): Fix exit test of loop adding SFTs as virtu...
authorRichard Guenther <rguenther@suse.de>
Tue, 30 Oct 2007 13:22:36 +0000 (13:22 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 30 Oct 2007 13:22:36 +0000 (13:22 +0000)
2007-10-30  Richard Guenther  <rguenther@suse.de>

* tree-ssa-operands.c (add_vars_for_offset): Fix exit test
of loop adding SFTs as virtual operands.

* gcc.c-torture/execute/20071030-1.c: New testcase copied from
gcc.target/i386/loop-3.c.

From-SVN: r129770

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20071030-1.c [new file with mode: 0644]
gcc/tree-ssa-operands.c

index 90dfa57ed73081f82d2cf9aa1330e480536a2fb6..14c0428daf2b787939792e6a1c21dfcc04915b52 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-30  Richard Guenther  <rguenther@suse.de>
+
+       * tree-ssa-operands.c (add_vars_for_offset): Fix exit test
+       of loop adding SFTs as virtual operands.
+
 2007-10-30  Richard Guenther  <rguenther@suse.de>
 
        * Makefile.in (dse.o): Add $(OPTABS_H) and $(RECOG_H) dependencies.
index 60f0c8fcb2cc7451358afa9fc13e73e62bf433e3..11a54f178588614dbb837fe16933999193cca7cd 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-30  Richard Guenther  <rguenther@suse.de>
+
+       * gcc.c-torture/execute/20071030-1.c: New testcase copied from
+       gcc.target/i386/loop-3.c.
+
 2007-10-30  Revital Eres  <eres@il.ibm.com>
 
        * testsuite/gcc.dg/vect/pr33866.c: Require vect_long.
diff --git a/gcc/testsuite/gcc.c-torture/execute/20071030-1.c b/gcc/testsuite/gcc.c-torture/execute/20071030-1.c
new file mode 100644 (file)
index 0000000..7be3cd8
--- /dev/null
@@ -0,0 +1,79 @@
+/* PR target/11044 */
+/* Originator: Tim McGrath <misty-@charter.net> */
+/* Testcase contributed by Eric Botcazou <ebotcazou@libertysurf.fr> */
+
+/* Testcase copied from gcc.target/i386/loop-3.c */
+
+extern void *memset (void *, int, __SIZE_TYPE__);
+extern void abort (void);
+
+typedef struct
+{
+        unsigned char colormod;
+} entity_state_t;
+
+typedef struct
+{
+        int num_entities;
+        entity_state_t *entities;
+} packet_entities_t;
+
+typedef struct
+{
+        double senttime;
+        float ping_time;
+        packet_entities_t entities;
+} client_frame_t;
+
+typedef enum
+{
+        cs_free,
+        cs_server,
+        cs_zombie,
+        cs_connected,
+        cs_spawned
+} sv_client_state_t;
+
+typedef struct client_s
+{
+        sv_client_state_t state;
+        int ping;
+        client_frame_t frames[64];
+} client_t;
+
+int CalcPing (client_t *cl)
+{
+        float ping;
+        int count, i;
+        register client_frame_t *frame;
+
+        if (cl->state == cs_server)
+                return cl->ping;
+        ping = 0;
+        count = 0;
+        for (frame = cl->frames, i = 0; i < 64; i++, frame++) {
+                if (frame->ping_time > 0) {
+                        ping += frame->ping_time;
+                        count++;
+                }
+        }
+        if (!count)
+                return 9999;
+        ping /= count;
+
+        return ping * 1000;
+}
+
+int main(void)
+{
+   client_t cl;
+
+   memset(&cl, 0, sizeof(cl));
+
+   cl.frames[0].ping_time = 1.0f;
+
+   if (CalcPing(&cl) != 1000)
+     abort();
+
+   return 0;
+}
index 8772313f3acc8a59948992cefadfbea419f1d863..2f957054310c044632b927b108211ce69a7c68c5 100644 (file)
@@ -1409,7 +1409,8 @@ add_vars_for_offset (tree var,
 
   for (; VEC_iterate (tree, sv, i, subvar); ++i)
     {
-      if (size <= SFT_OFFSET (subvar) - offset)
+      if (SFT_OFFSET (subvar) > offset
+         && size <= SFT_OFFSET (subvar) - offset)
        break;
 
       if (is_def)