From 9e20be0cb2d7a3fcd2c82049493e0c458c2f2eaa Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 9 Aug 2002 02:01:12 +0200 Subject: [PATCH] i386.c (legitimate_constant_p): UNSPEC_TP is not legitimate constant. * config/i386/i386.c (legitimate_constant_p): UNSPEC_TP is not legitimate constant. (legitimate_pic_operand_p): Neither pic operand. (legitimate_address_p): But legitimate address. (get_thread_pointer): Generate MEM/u instead of CONST around UNSPEC_TP. (print_operand): Remove printing of UNSPEC_TP. (print_operand_address): And print it here. * gcc.dg/tls/opt-2.c: New test. From-SVN: r56143 --- gcc/ChangeLog | 12 ++++++++ gcc/config/i386/i386.c | 36 ++++++++++++---------- gcc/testsuite/ChangeLog | 7 ++++- gcc/testsuite/gcc.dg/tls/opt-2.c | 53 ++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 17 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tls/opt-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7c22cb673c1..9e0b0853968 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,16 @@ +2002-08-08 Jakub Jelinek + + * config/i386/i386.c (legitimate_constant_p): UNSPEC_TP is not + legitimate constant. + (legitimate_pic_operand_p): Neither pic operand. + (legitimate_address_p): But legitimate address. + (get_thread_pointer): Generate MEM/u instead of CONST around + UNSPEC_TP. + (print_operand): Remove printing of UNSPEC_TP. + (print_operand_address): And print it here. + 2002-08-08 Devang Patel + * objc/objc-act.c (build_selector_translation_table): Issue warning, when -Wselector is used,if method for which selector is being created does not exist. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 5ef4e7637c6..0c1ed9fa29e 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -4850,8 +4850,6 @@ legitimate_constant_p (x) { case UNSPEC_TPOFF: return local_exec_symbolic_operand (XVECEXP (inner, 0, 0), Pmode); - case UNSPEC_TP: - return true; default: return false; } @@ -4914,8 +4912,6 @@ legitimate_pic_operand_p (x) { case UNSPEC_TPOFF: return local_exec_symbolic_operand (XVECEXP (inner, 0, 0), Pmode); - case UNSPEC_TP: - return true; default: return false; } @@ -5054,6 +5050,13 @@ legitimate_address_p (mode, addr, strict) debug_rtx (addr); } + if (GET_CODE (addr) == UNSPEC && XINT (addr, 1) == UNSPEC_TP) + { + if (TARGET_DEBUG_ADDR) + fprintf (stderr, "Success.\n"); + return TRUE; + } + if (ix86_decompose_address (addr, &parts) <= 0) { reason = "decomposition failed"; @@ -5521,7 +5524,9 @@ get_thread_pointer () rtx tp; tp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx), UNSPEC_TP); - tp = gen_rtx_CONST (Pmode, tp); + tp = gen_rtx_MEM (Pmode, tp); + RTX_UNCHANGING_P (tp) = 1; + set_mem_alias_set (tp, ix86_GOT_alias_set ()); tp = force_reg (Pmode, tp); return tp; @@ -6611,17 +6616,6 @@ print_operand (file, x, code) fprintf (file, "%s", dstr); } - else if (GET_CODE (x) == CONST - && GET_CODE (XEXP (x, 0)) == UNSPEC - && XINT (XEXP (x, 0), 1) == UNSPEC_TP) - { - if (ASSEMBLER_DIALECT == ASM_INTEL) - fputs ("DWORD PTR ", file); - if (ASSEMBLER_DIALECT == ASM_ATT || USER_LABEL_PREFIX[0] == 0) - putc ('%', file); - fputs ("gs:0", file); - } - else { if (code != 'P') @@ -6660,6 +6654,16 @@ print_operand_address (file, addr) rtx base, index, disp; int scale; + if (GET_CODE (addr) == UNSPEC && XINT (addr, 1) == UNSPEC_TP) + { + if (ASSEMBLER_DIALECT == ASM_INTEL) + fputs ("DWORD PTR ", file); + if (ASSEMBLER_DIALECT == ASM_ATT || USER_LABEL_PREFIX[0] == 0) + putc ('%', file); + fputs ("gs:0", file); + return; + } + if (! ix86_decompose_address (addr, &parts)) abort (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 07c3a50b94f..3e18dc1c340 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ +2002-08-08 Jakub Jelinek + + * gcc.dg/tls/opt-2.c: New test. + 2002-08-08 Devang Patel - *objc.dg/selector-1.m : New test + + * objc.dg/selector-1.m : New test 2002-08-08 Nathan Sidwell diff --git a/gcc/testsuite/gcc.dg/tls/opt-2.c b/gcc/testsuite/gcc.dg/tls/opt-2.c new file mode 100644 index 00000000000..713fb7f360c --- /dev/null +++ b/gcc/testsuite/gcc.dg/tls/opt-2.c @@ -0,0 +1,53 @@ +/* This testcase generated invalid assembly on IA-32, + since %gs:0 memory load was not exposed to the compiler + as memory load and mem to mem moves are not possible + on IA-32. */ +/* { dg-do link } */ +/* { dg-options "-O2 -ftls-model=initial-exec" } */ +/* { dg-options "-O2 -ftls-model=initial-exec -march=i686" { target i?86-*-* } } */ + +__thread int thr; + +struct A +{ + unsigned int a, b, c, d, e; +}; + +int bar (int x, unsigned long y, void *z) +{ + return 0; +} + +int +foo (int x, int y, const struct A *z) +{ + struct A b; + int d; + + b = *z; + d = bar (x, y, &b); + if (d == 0 && y == 0x5402) + { + int e = thr; + d = bar (x, 0x5401, &b); + if (d) + { + thr = e; + d = 0; + } + else if ((z->c & 0600) != (b.c & 0600) + || ((z->c & 060) && ((z->c & 060) != (b.c & 060)))) + { + thr = 22; + d = -1; + } + } + + return d; +} + +int main (void) +{ + foo (1, 2, 0); + return 0; +} -- 2.30.2