+2009-01-29 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline:
+ 2009-01-28 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/38988
+ * config/i386/i386.md (set_rip_rex64): Wrap operand 1 in label_ref.
+ (set_got_offset_rex64): Ditto.
+
+ 2009-01-27 Uros Bizjak <ubizjak@gmail.com>
+
+ PR middle-end/38969
+ * calls.c (initialize_argument_information): Do not wrap complex
+ arguments in SAVE_EXPR.
+
2009-01-27 Steve Ellcey <sje@cup.hp.com>
PR middle-end/38615
&& targetm.calls.split_complex_arg (argtype))
{
tree subtype = TREE_TYPE (argtype);
- arg = save_expr (arg);
args[j].tree_value = build1 (REALPART_EXPR, subtype, arg);
j += inc;
args[j].tree_value = build1 (IMAGPART_EXPR, subtype, arg);
(define_insn "set_rip_rex64"
[(set (match_operand:DI 0 "register_operand" "=r")
- (unspec:DI [(match_operand:DI 1 "" "")] UNSPEC_SET_RIP))]
+ (unspec:DI [(label_ref (match_operand 1 "" ""))] UNSPEC_SET_RIP))]
"TARGET_64BIT"
"lea{q}\t{%l1(%%rip), %0|%0, %l1[rip]}"
[(set_attr "type" "lea")
(define_insn "set_got_offset_rex64"
[(set (match_operand:DI 0 "register_operand" "=r")
- (unspec:DI [(match_operand:DI 1 "" "")] UNSPEC_SET_GOT_OFFSET))]
+ (unspec:DI
+ [(label_ref (match_operand 1 "" ""))]
+ UNSPEC_SET_GOT_OFFSET))]
"TARGET_64BIT"
"movabs{q}\t{$_GLOBAL_OFFSET_TABLE_-%l1, %0|%0, OFFSET FLAT:_GLOBAL_OFFSET_TABLE_-%l1}"
[(set_attr "type" "imov")
+2009-01-29 Uros Bizjak <ubizjak@gmail.com>
+
+ Backport from mainline:
+ 2009-01-28 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/38988
+ * gcc.target/i386/pr38988.c: New test.
+
+ 2009-01-27 Uros Bizjak <ubizjak@gmail.com>
+
+ PR middle-end/38969
+ * gcc.c-torture/execute/pr38969.c: New test.
+
2009-01-27 Steve Ellcey <sje@cup.hp.com>
PR middle-end/38615
--- /dev/null
+__complex__ float
+__attribute__ ((noinline)) foo (__complex__ float x)
+{
+ return x;
+}
+
+__complex__ float
+__attribute__ ((noinline)) bar (__complex__ float x)
+{
+ return foo (x);
+}
+
+int main()
+{
+ __complex__ float a, b;
+ __real__ a = 9;
+ __imag__ a = 42;
+
+ b = bar (a);
+
+ if (a != b)
+ abort ();
+
+ return 0;
+}
--- /dev/null
+/* { dg-do compile } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-require-effective-target fpic } */
+/* { dg-options "-O2 -fpic -mcmodel=large" } */
+
+typedef long unsigned int size_t;
+typedef void (*func_ptr) (void);
+
+static func_ptr __DTOR_LIST__[1] = { (func_ptr) (-1) };
+
+void
+__do_global_dtors_aux (void)
+{
+ extern func_ptr __DTOR_END__[];
+ size_t dtor_idx = 0;
+ const size_t max_idx = __DTOR_END__ - __DTOR_LIST__ - 1;
+ func_ptr f;
+
+ while (dtor_idx < max_idx)
+ {
+ f = __DTOR_LIST__[++dtor_idx];
+ f ();
+ }
+}