re PR target/9164 ([Alpha] improper code generation)
authorFalk Hueffner <falk.hueffner@student.uni-tuebingen.de>
Sun, 16 Mar 2003 19:43:53 +0000 (19:43 +0000)
committerRichard Henderson <rth@gcc.gnu.org>
Sun, 16 Mar 2003 19:43:53 +0000 (11:43 -0800)
        PR target/9164
        * tree.c (get_narrower): For extensions with unchanged bit number,
        return the unsignedness of the outer mode.

        * gcc.c-torture/execute/20030316-1.c: New test case.

From-SVN: r64440

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

index ad268466898772a9944143bbc2572f16e9bbde2e..d7d2eb465618ab4d403b7fdc061bea3198772301 100644 (file)
@@ -1,3 +1,9 @@
+2003-03-16  Falk Hueffner  <falk.hueffner@student.uni-tuebingen.de>
+
+       PR target/9164
+       * tree.c (get_narrower): For extensions with unchanged bit number,
+       return the unsignedness of the outer mode.
+
 2003-03-16  Roger Sayle  <roger@eyesopen.com>
 
        * c-typeck.c (build_component_ref):  Turn "for" into "do .. while"
index d4558f61f9d047c908d627f68bfc849525715791..423b43d93ea5ff5e03b62fd64c18653f39ea7170 100644 (file)
@@ -1,3 +1,7 @@
+2003-03-16  Falk Hueffner  <falk.hueffner@student.uni-tuebingen.de>
+
+       * gcc.c-torture/execute/20030316-1.c: New test case.
+
 2003-03-16  Nathan Sidwell  <nathan@codesourcery.com>
 
        PR c++/9629
diff --git a/gcc/testsuite/gcc.c-torture/execute/20030316-1.c b/gcc/testsuite/gcc.c-torture/execute/20030316-1.c
new file mode 100644 (file)
index 0000000..bde2e13
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR target/9164 */
+/* The comparison operand was sign extended erraneously.  */
+
+int
+main (void)
+{
+    long j = 0x40000000;
+    if ((unsigned int) (0x40000000 + j) < 0L)
+       abort ();
+
+    return 0;
+}
index 013085955212ec0ede1e9b5c35790d8dc75fb808..30a1c59d5d8a8e00d303aeb3f59991926ad10a30 100644 (file)
@@ -3958,10 +3958,10 @@ get_narrower (op, unsignedp_ptr)
 
       /* See what's inside this conversion.  If we decide to strip it,
         we will set WIN.  */
-      op = TREE_OPERAND (op, 0);
 
       if (bitschange > 0)
        {
+         op = TREE_OPERAND (op, 0);
          /* An extension: the outermost one can be stripped,
             but remember whether it is zero or sign extension.  */
          if (first)
@@ -3980,6 +3980,7 @@ get_narrower (op, unsignedp_ptr)
          if (first)
            uns = TREE_UNSIGNED (TREE_TYPE (op));
          first = 0;
+         op = TREE_OPERAND (op, 0);
        }
 
       win = op;