re PR target/44546 (ICE in extract_insn, at recog.c:2103 with -ffast-math -Os (compil...
authorUros Bizjak <uros@gcc.gnu.org>
Sun, 20 Jun 2010 21:42:10 +0000 (23:42 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Sun, 20 Jun 2010 21:42:10 +0000 (23:42 +0200)
PR target/44546
* config/i386/predicates.md (ix86_swapped_fp_comparsion_operator):
New predicate.
* config/i386/i386.md (*fp_jcc_8<mode>_387): Use
ix86_swapped_fp_comparsion_operator instead of
ix86_fp_comparison_operator.

(*fp_jcc_1_387): Rename from *fp_jcc_3_387.
(*fp_jcc_1r_387): Rename from *fp_jcc_4_387.
(*fp_jcc_2_387): Rename from *fp_jcc_5_387.
(*fp_jcc_2r_387): Rename from *fp_jcc_6_387.
(*fp_jcc_3_387): Rename from *fp_jcc_7_387.
(*fp_jcc_4_<mode>_387): Rename from *fp_jcc_8<mode>_387.

testsuite/ChangeLog:

PR target/44546
* gcc.target/i386/pr44546.c: New test.

From-SVN: r161055

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/config/i386/predicates.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr44546.c [new file with mode: 0644]

index a0cbd40..b87c634 100644 (file)
@@ -1,3 +1,19 @@
+2010-06-20  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/44546
+       * config/i386/predicates.md (ix86_swapped_fp_comparsion_operator):
+       New predicate.
+       * config/i386/i386.md (*fp_jcc_8<mode>_387): Use
+       ix86_swapped_fp_comparsion_operator instead of
+       ix86_fp_comparison_operator.
+
+       (*fp_jcc_1_387): Rename from *fp_jcc_3_387.
+       (*fp_jcc_1r_387): Rename from *fp_jcc_4_387.
+       (*fp_jcc_2_387): Rename from *fp_jcc_5_387.
+       (*fp_jcc_2r_387): Rename from *fp_jcc_6_387.
+       (*fp_jcc_3_387): Rename from *fp_jcc_7_387.
+       (*fp_jcc_4_<mode>_387): Rename from *fp_jcc_8<mode>_387.
+
 2010-06-20  Joseph Myers  <joseph@codesourcery.com>
 
        PR other/32998
@@ -15,8 +31,7 @@
        decode_cmdline_options_to_array.  Use decoded options for -O
        scan.  Use integral_argument for -O parameters.  Update call to
        read_cmdline_options.
-       (enable_warning_as_error): Update handling of find_opt return
-       value.
+       (enable_warning_as_error): Update handling of find_opt return value.
        * opts.h: Update comment on unknown options.
        (struct cl_decoded_option): Update comments on opt_index and arg.
        Add orig_option_with_args_text.
        (save_decoded_options, save_decoded_options_count): New.
        (read_integral_parameter): Remove.
        (print_switch_values): Use decoded options.
-       (toplev_main): Don't set save_argv.  Update call to
-       decode_options.
+       (toplev_main): Don't set save_argv.  Update call to decode_options.
        * toplev.h (read_integral_parameter): Remove.
-       * varasm.c (elf_record_gcc_switches): Don't handle holding back
-       names.
+       * varasm.c (elf_record_gcc_switches): Don't handle holding back names.
 
 2010-06-19  Richard Earnshaw  <rearnsha@arm.com>
 
 2010-06-17  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        PR target/43740
-       config/pa/pa.c (emit_move_sequence): Don't infer REG_POINTER flag for
-       SET source operand from SET destination operand.
+       * config/pa/pa.c (emit_move_sequence): Don't infer REG_POINTER flag
+       for SET source operand from SET destination operand.
 
 2010-06-17  Bernd Schmidt  <bernds@codesourcery.com>
 
 
 2010-06-16  Richard Guenther  <rguenther@suse.de>
 
-       * tree-inline.c (remap_gimple_op_r): Recurse using
-       remap_gimple_op_r.
+       * tree-inline.c (remap_gimple_op_r): Recurse using remap_gimple_op_r.
 
 2010-06-16  Douglas B Rupp  <rupp@gnat.com>
 
        (AT_vms_delta1, AT_vms_delta2, add_AT_vms_delta): Declare
        new static functions.
        (dwarf_attr_name): New cases DW_AT_HP_{prologue,epilogue}.
-       (AT_vms_delta1, AT_vms_delta2, add_AT_vms_delta): New 
+       (AT_vms_delta1, AT_vms_delta2, add_AT_vms_delta): New
        static functions.
        (print_die): New case dw_val_class_vms_delta.
        (attr_checksum): Likewise.
        (bitset): Remove early clobber from destination.
        (bitset_in_memory): Likewise.
        (lrintsf2): Clobber the cc0 register.
-       * config/rx/rx.c (rx_notice_update_cc):
-       Handle CC_SET_ZSC.
+       * config/rx/rx.c (rx_notice_update_cc): Handle CC_SET_ZSC.
        (rx_print_operand): Handle %N.
 
 2010-06-16  Jan Hubicka  <jh@suse.cz>
 2010-05-29  Jan Hubicka  <jh@suse.cz>
 
        * cgraphunit.c (cgraph_materialize_clone): Only remove calles,
-       refs and body; not the whole node for masters of materialized
-       clones.
+       refs and body; not the whole node for masters of materialized clones.
 
 2010-05-29  Mike Stump  <mikestump@comcast.net>
 
        * gcc.c (inform, warning, inform): New functions.
        (fatal_ice): Rename to internal_error; change cmsgid parameter to
        gmsgid.  All callers changed.
-       (notice): Rename to fnotice; add parameter fp.  All callers
-       changed.
+       (notice): Rename to fnotice; add parameter fp.  All callers changed.
        (fatal_error): Rename to fatal_signal.  All users changed.
        (fatal): Rename to fatal_error; change cmsgid parameter to
        gmsgid.  All callers changed.
        (warning): Declare.
        * config/darwin-driver.c (darwin_default_min_version): Use warning
        instead of fprintf for warnings.
-       * cppspec.c (lang_specific_driver): Use fatal_error instead of
-       fatal.
+       * cppspec.c (lang_specific_driver): Use fatal_error instead of fatal.
 
 2010-05-28  Julian Brown  <julian@codesourcery.com>
 
index c81b647..777f8e7 100644 (file)
 ;; Define combination compare-and-branch fp compare instructions to help
 ;; combine.
 
-(define_insn "*fp_jcc_3_387"
+(define_insn "*fp_jcc_1_387"
   [(set (pc)
        (if_then_else (match_operator 0 "ix86_fp_comparison_operator"
                        [(match_operand 1 "register_operand" "f")
    && !TARGET_CMOVE"
   "#")
 
-(define_insn "*fp_jcc_4_387"
+(define_insn "*fp_jcc_1r_387"
   [(set (pc)
        (if_then_else (match_operator 0 "ix86_fp_comparison_operator"
                        [(match_operand 1 "register_operand" "f")
    && !TARGET_CMOVE"
   "#")
 
-(define_insn "*fp_jcc_5_387"
+(define_insn "*fp_jcc_2_387"
   [(set (pc)
        (if_then_else (match_operator 0 "ix86_fp_comparison_operator"
                        [(match_operand 1 "register_operand" "f")
    && !TARGET_CMOVE"
   "#")
 
-(define_insn "*fp_jcc_6_387"
+(define_insn "*fp_jcc_2r_387"
   [(set (pc)
        (if_then_else (match_operator 0 "ix86_fp_comparison_operator"
                        [(match_operand 1 "register_operand" "f")
    && !TARGET_CMOVE"
   "#")
 
-(define_insn "*fp_jcc_7_387"
+(define_insn "*fp_jcc_3_387"
   [(set (pc)
        (if_then_else (match_operator 0 "ix86_fp_comparison_operator"
                        [(match_operand 1 "register_operand" "f")
    && !TARGET_CMOVE"
   "#")
 
-;; The order of operands in *fp_jcc_8_387 is forced by combine in
-;; simplify_comparison () function. Float operator is treated as RTX_OBJ
-;; with a precedence over other operators and is always put in the first
-;; place. Swap condition and operands to match ficom instruction.
-
-(define_insn "*fp_jcc_8<mode>_387"
-  [(set (pc)
-       (if_then_else (match_operator 0 "ix86_fp_comparison_operator"
-                       [(match_operator 1 "float_operator"
-                          [(match_operand:X87MODEI12 2 "nonimmediate_operand" "m,?r")])
-                          (match_operand 3 "register_operand" "f,f")])
-         (label_ref (match_operand 4 "" ""))
-         (pc)))
-   (clobber (reg:CCFP FPSR_REG))
-   (clobber (reg:CCFP FLAGS_REG))
-   (clobber (match_scratch:HI 5 "=a,a"))]
-  "X87_FLOAT_MODE_P (GET_MODE (operands[3]))
-   && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))
-   && GET_MODE (operands[1]) == GET_MODE (operands[3])
-   && ix86_fp_compare_mode (swap_condition (GET_CODE (operands[0]))) == CCFPmode
-   && !TARGET_CMOVE"
-  "#")
-
 (define_split
   [(set (pc)
        (if_then_else (match_operator 0 "ix86_fp_comparison_operator"
   DONE;
 })
 
+;; The order of operands in *fp_jcc_4_387 is forced by combine in
+;; simplify_comparison () function. Float operator is treated as RTX_OBJ
+;; with a precedence over other operators and is always put in the first
+;; place. Swap condition and operands to match ficom instruction.
+
+(define_insn "*fp_jcc_4_<mode>_387"
+  [(set (pc)
+       (if_then_else
+         (match_operator 0 "ix86_swapped_fp_comparison_operator"
+           [(match_operator 1 "float_operator"
+             [(match_operand:X87MODEI12 2 "nonimmediate_operand" "m,?r")])
+            (match_operand 3 "register_operand" "f,f")])
+         (label_ref (match_operand 4 "" ""))
+         (pc)))
+   (clobber (reg:CCFP FPSR_REG))
+   (clobber (reg:CCFP FLAGS_REG))
+   (clobber (match_scratch:HI 5 "=a,a"))]
+  "X87_FLOAT_MODE_P (GET_MODE (operands[3]))
+   && (TARGET_USE_<MODE>MODE_FIOP || optimize_function_for_size_p (cfun))
+   && GET_MODE (operands[1]) == GET_MODE (operands[3])
+   && ix86_fp_compare_mode (swap_condition (GET_CODE (operands[0]))) == CCFPmode
+   && !TARGET_CMOVE"
+  "#")
+
 (define_split
   [(set (pc)
-       (if_then_else (match_operator 0 "ix86_fp_comparison_operator"
-                       [(match_operator 1 "float_operator"
-                          [(match_operand:X87MODEI12 2 "memory_operand" "")])
-                          (match_operand 3 "register_operand" "")])
+       (if_then_else
+         (match_operator 0 "ix86_swapped_fp_comparison_operator"
+           [(match_operator 1 "float_operator"
+             [(match_operand:X87MODEI12 2 "memory_operand" "")])
+            (match_operand 3 "register_operand" "")])
          (match_operand 4 "" "")
          (match_operand 5 "" "")))
    (clobber (reg:CCFP FPSR_REG))
 ;; %%% Kill this when reload knows how to do it.
 (define_split
   [(set (pc)
-       (if_then_else (match_operator 0 "ix86_fp_comparison_operator"
-                       [(match_operator 1 "float_operator"
-                          [(match_operand:X87MODEI12 2 "register_operand" "")])
-                          (match_operand 3 "register_operand" "")])
+       (if_then_else
+         (match_operator 0 "ix86_swapped_fp_comparison_operator"
+           [(match_operator 1 "float_operator"
+             [(match_operand:X87MODEI12 2 "register_operand" "")])
+            (match_operand 3 "register_operand" "")])
          (match_operand 4 "" "")
          (match_operand 5 "" "")))
    (clobber (reg:CCFP FPSR_REG))
index a33d3af..e5fea4a 100644 (file)
                (match_operand 0 "comparison_operator")
                (match_operand 0 "ix86_trivial_fp_comparison_operator")))
 
+;; Same as above, but for swapped comparison used in fp_jcc_4_387.
+(define_predicate "ix86_swapped_fp_comparison_operator"
+  (match_operand 0 "comparison_operator")
+{
+  enum rtx_code code = GET_CODE (op);
+  int ret;
+
+  PUT_CODE (op, swap_condition (code));
+  ret = ix86_fp_comparison_operator (op, mode);
+  PUT_CODE (op, code);
+  return ret;
+})
+
 ;; Nearly general operand, but accept any const_double, since we wish
 ;; to be able to drop them into memory rather than have them get pulled
 ;; into registers.
index 922073a..e0c2cda 100644 (file)
@@ -1,3 +1,8 @@
+2010-06-20  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/44546
+       * gcc.target/i386/pr44546.c: New test.
+
 2010-06-20  Joseph Myers  <joseph@codesourcery.com>
 
        * gcc.dg/opts-2.c: New test.
 
 2010-06-12  Daniel Franke  <franke.daniel@gmail.com>
 
-        * gfortran.dg/whole_file_20.f03: New.
+       * gfortran.dg/whole_file_20.f03: New.
 
 2010-06-12  Jan Hubicka  <jh@suse.cz>
 
diff --git a/gcc/testsuite/gcc.target/i386/pr44546.c b/gcc/testsuite/gcc.target/i386/pr44546.c
new file mode 100644 (file)
index 0000000..517446f
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -ffast-math -mfpmath=387" } */
+
+typedef __SIZE_TYPE__ size_t;
+typedef struct
+{
+  float *ewgts;
+} vtx_data;
+
+extern void *zmalloc (size_t);
+extern int whatever (vtx_data *);
+
+float *
+compute_apsp_artifical_weights_packed (vtx_data * graph, int n)
+{
+  float *weights;
+
+  weights = (float *) zmalloc (n * sizeof (float));
+  weights[n] =
+    whatever (graph) > graph[n].ewgts[n] ?
+    whatever (graph) : graph[n].ewgts[n];
+}