Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/808394/?format=api
{ "id": 808394, "url": "http://patchwork.ozlabs.org/api/patches/808394/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/CAFULd4bW+ms-Vc_HV6tcbGkMroiw1NweqaSsepx2QF7zQRP-QA@mail.gmail.com/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<CAFULd4bW+ms-Vc_HV6tcbGkMroiw1NweqaSsepx2QF7zQRP-QA@mail.gmail.com>", "list_archive_url": null, "date": "2017-08-31T19:32:57", "name": "[RFC,i386] : Convert TLS location to DEFAULT_TLS_SEG_REG address space", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "00846b9da359152dfce130bd9a843f9c246c4f4a", "submitter": { "id": 808, "url": "http://patchwork.ozlabs.org/api/people/808/?format=api", "name": "Uros Bizjak", "email": "ubizjak@gmail.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/CAFULd4bW+ms-Vc_HV6tcbGkMroiw1NweqaSsepx2QF7zQRP-QA@mail.gmail.com/mbox/", "series": [ { "id": 897, "url": "http://patchwork.ozlabs.org/api/series/897/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=897", "date": "2017-08-31T19:32:57", "name": "[RFC,i386] : Convert TLS location to DEFAULT_TLS_SEG_REG address space", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/897/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/808394/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/808394/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<gcc-patches-return-461230-incoming=patchwork.ozlabs.org@gcc.gnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": [ "patchwork-incoming@bilbo.ozlabs.org", "mailing list gcc-patches@gcc.gnu.org" ], "Authentication-Results": [ "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org\n\t(client-ip=209.132.180.131; helo=sourceware.org;\n\tenvelope-from=gcc-patches-return-461230-incoming=patchwork.ozlabs.org@gcc.gnu.org;\n\treceiver=<UNKNOWN>)", "ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org\n\theader.b=\"C0hOYTvh\"; dkim-atps=neutral", "sourceware.org; auth=none" ], "Received": [ "from sourceware.org (server1.sourceware.org [209.132.180.131])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xjswn3nrTz9s8P\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri, 1 Sep 2017 05:33:10 +1000 (AEST)", "(qmail 121469 invoked by alias); 31 Aug 2017 19:33:02 -0000", "(qmail 121402 invoked by uid 89); 31 Aug 2017 19:33:01 -0000", "from mail-ua0-f181.google.com (HELO mail-ua0-f181.google.com)\n\t(209.85.217.181) by sourceware.org\n\t(qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP;\n\tThu, 31 Aug 2017 19:32:59 +0000", "by mail-ua0-f181.google.com with SMTP id g47so60877uad.0 for\n\t<gcc-patches@gcc.gnu.org>; Thu, 31 Aug 2017 12:32:59 -0700 (PDT)", "by 10.103.55.28 with HTTP; Thu, 31 Aug 2017 12:32:57 -0700 (PDT)" ], "DomainKey-Signature": "a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender\n\t:mime-version:from:date:message-id:subject:to:content-type; q=\n\tdns; s=default; b=q7PEOEjkAL7QzbCOWWpZnq3dldhaX/7/CMr7I6URBqTjBs\n\tlxgt1IFCiJRa/drR0JNnpXGNP4rYfmgRYTKjTQm5E7s9NJhEpxQVPvLf/07jdEbp\n\t2EnN8XScLWkqe8Tw8+kUg/Xq/ys/Gn12Tdg9U9OzkZ7mOdnkInApKvAaCs1e4=", "DKIM-Signature": "v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id\n\t:list-unsubscribe:list-archive:list-post:list-help:sender\n\t:mime-version:from:date:message-id:subject:to:content-type; s=\n\tdefault; bh=yR08gUO4ik00bpJayo6ezxu5QmI=; b=C0hOYTvhWRoC0ezJ47bB\n\tRg1WH5gcaJjVpleRdyekJcsyx/+grv8hl3+fLfPt2/rQz/qWuulGDo0YqvgxE9nU\n\tzuPQSoizNRLDcfuH1se6a35BS6+pcQOoemIE8z0bZrFozwxshGqBiHNJRaFpgwLu\n\tRVXabSj8m33yRIqsH/ocKKs=", "Mailing-List": "contact gcc-patches-help@gcc.gnu.org; run by ezmlm", "Precedence": "bulk", "List-Id": "<gcc-patches.gcc.gnu.org>", "List-Unsubscribe": "<mailto:gcc-patches-unsubscribe-incoming=patchwork.ozlabs.org@gcc.gnu.org>", "List-Archive": "<http://gcc.gnu.org/ml/gcc-patches/>", "List-Post": "<mailto:gcc-patches@gcc.gnu.org>", "List-Help": "<mailto:gcc-patches-help@gcc.gnu.org>", "Sender": "gcc-patches-owner@gcc.gnu.org", "X-Virus-Found": "No", "X-Spam-SWARE-Status": "No, score=-10.1 required=5.0 tests=AWL, BAYES_00,\n\tFREEMAIL_FROM, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS,\n\tRCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM,\n\tSPF_PASS autolearn=ham version=3.3.2 spammy=cf, splitter, U*a", "X-HELO": "mail-ua0-f181.google.com", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net;\n\ts=20161025;\n\th=x-gm-message-state:mime-version:from:date:message-id:subject:to;\n\tbh=0TUyRgkkXWrTQJcNM+1I/cmfsJJIqM72HeNzdvZAO0M=;\n\tb=idvho2INM00JlxtSEFejfLPJSZ8gVD5eKowNXgbmfkNy9lS6bUf/qh3hGlBFCfkk8r\n\tk/EQPr24CyqRIn652DAo9sPog1zjvKr3BI4YhJa6MW0H4/YWk04MuXCJPmo3bWN/IgPV\n\tTCHX2ep81lGzw9eTBfQffTI/z3/2mDR/UadWV5kkG9QpIwCpEuR/yvrAOZ/W4i+VvgLA\n\t31xjXj81R+Rn7TAAvBkpFxn+7X9HKymLZRkgzHEedaQPkUxPWAM5yohoaJzNuYiiMl+i\n\tuTYmfZV7bAV1dOCp5+X6QwYZ14yEfVKtc4m5LK751jHsNU+jYnFoY711RyLP9LTtOsjj\n\tqH3A==", "X-Gm-Message-State": "AHYfb5hKH4FLIfvAKMoT6OXpVVEzmL8MdgG/XuyjY524qD184gFTFzdN\tjHh231P6FlQQPIxrkXIw730uMkuKLxBV", "X-Google-Smtp-Source": "ADKCNb4w77lYvaAv04q2sdRtRiiVwr5Da6P6pB6ttlWXQcwc9v5ajS6mcxndEls+U+8LYaEcYcxj0Sx7FQPXCy0wP1M=", "X-Received": "by 10.176.10.44 with SMTP id q44mr4399829uah.143.1504207977747;\n\tThu, 31 Aug 2017 12:32:57 -0700 (PDT)", "MIME-Version": "1.0", "From": "Uros Bizjak <ubizjak@gmail.com>", "Date": "Thu, 31 Aug 2017 21:32:57 +0200", "Message-ID": "<CAFULd4bW+ms-Vc_HV6tcbGkMroiw1NweqaSsepx2QF7zQRP-QA@mail.gmail.com>", "Subject": "[RFC PATCH,\n\ti386]: Convert TLS location to DEFAULT_TLS_SEG_REG address space", "To": "\"gcc-patches@gcc.gnu.org\" <gcc-patches@gcc.gnu.org>", "Content-Type": "multipart/mixed; boundary=\"f403045f6d902ec096055811b6f8\"" }, "content": "Hello!\n\nUsing following testcase:\n\n--cut here--\n__thread int a;\n\nint foo (void)\n{\n return a;\n}\n--cut here--\n\nAttached patch converts TLS location in the form of:\n\n (mem/c:SI (plus:DI (unspec:DI [\n (const_int 0 [0])\n ] UNSPEC_TP)\n (const:DI (unspec:DI [\n (symbol_ref:DI (\"a\") [flags 0x2a]\n<var_decl 0x7f8c3acd5e10 a>)\n ] UNSPEC_NTPOFF))) [1 a+0 S4 A32]))\n\"thread.c\":5 82 {*movsi_internal}\nto:\n\n (mem/c:SI (const:DI (unspec:DI [\n (symbol_ref:DI (\"a\") [flags 0x2a] <var_decl\n0x7f8c3acd5e10 a>)\n ] UNSPEC_NTPOFF)) [1 a+0 S4 A32 AS1])) \"thread.c\":5 -1\n\navoiding the UNSPEC_TP tag and instead mark the location with AS.\n\nThis way, address space becomes the property of the memory location,\nnot of the address itself, so we don't need ugly hacks when the\naddress is moved to a register (LEA ignores segment overrides, c.f.\nsplit_long_move function in i386.c).\n\nPlease note that some instructions (e.g. prefetchX) operate on\nprefixed *address*, so we can't just rip out non-AS code from\nprint_operand. The above amended example:\n\n--cut here--\n__thread int a;\n\nint foo (void)\n{\n __builtin_prefetch (&a, 0);\n return a;\n}\n--cut here--\n\ncompiles to:\n\n prefetcht0 %fs:a@tpoff\n movl %fs:a@tpoff, %eax\n\nwhere prefetch operand remains:\n\n(insn 7 6 16 2 (prefetch (plus:DI (unspec:DI [\n (const_int 0 [0])\n ] UNSPEC_TP)\n (const:DI (unspec:DI [\n (symbol_ref:DI (\"a\") [flags 0x2a] <var_decl\n0x7fe994a14e10 a>)\n ] UNSPEC_NTPOFF)))\n (const_int 0 [0])\n (const_int 3 [0x3])) \"thread.c\":5 1010 {*prefetch_sse}\n (nil))\n\n2017-08-31 Uros Bizjak <ubizjak@gmail.com>\n\n * config/i386/i386-protos.h (ix86_tls_address_pattern_p) New prototype.\n (ix86_rewrite_tls_address): Ditto.\n * config/i386/i386.c (ix86_tls_address_pattern_p) New function.\n (ix86_rewrite_tls_address_1): Ditto.\n (ix86_rewrite_tls_address): Ditto.\n * config/i386/predicates.md (tls_address_pattern): New predicate.\n * config/i386/i386.md (TLS address splitter): New splitter.\n\nPatch was bootstrapped and regression tested on x86_64-linux-gnu\n{,-m32}, all default languages plus go.\n\nI plan to commit the patch to the mainline early next week.\n\nUros", "diff": "Index: config/i386/i386-protos.h\n===================================================================\n--- config/i386/i386-protos.h\t(revision 251566)\n+++ config/i386/i386-protos.h\t(working copy)\n@@ -227,6 +227,8 @@ extern unsigned int ix86_get_callcvt (const_tree);\n #endif\n \n extern rtx ix86_tls_module_base (void);\n+extern bool ix86_tls_address_pattern_p (rtx);\n+extern rtx ix86_rewrite_tls_address (rtx);\n \n extern void ix86_expand_vector_init (bool, rtx, rtx);\n extern void ix86_expand_vector_set (bool, rtx, rtx, int);\nIndex: config/i386/i386.c\n===================================================================\n--- config/i386/i386.c\t(revision 251566)\n+++ config/i386/i386.c\t(working copy)\n@@ -17631,6 +17631,89 @@ legitimize_tls_address (rtx x, enum tls_model mode\n return dest;\n }\n \n+/* Return true if OP refers to a TLS address. */\n+bool\n+ix86_tls_address_pattern_p (rtx op)\n+{\n+ subrtx_var_iterator::array_type array;\n+ FOR_EACH_SUBRTX_VAR (iter, array, op, ALL)\n+ {\n+ rtx op = *iter;\n+ if (MEM_P (op))\n+\t{\n+\t rtx *x = &XEXP (op, 0);\n+\t while (GET_CODE (*x) == PLUS)\n+\t {\n+\t int i;\n+\t for (i = 0; i < 2; i++)\n+\t\t{\n+\t\t rtx u = XEXP (*x, i);\n+\t\t if (GET_CODE (u) == ZERO_EXTEND)\n+\t\t u = XEXP (u, 0);\n+\t\t if (GET_CODE (u) == UNSPEC\n+\t\t && XINT (u, 1) == UNSPEC_TP)\n+\t\t return true;\n+\t\t}\n+\t x = &XEXP (*x, 0);\n+\t }\n+\n+\t iter.skip_subrtxes ();\n+\t}\n+ }\n+\n+ return false;\n+}\n+\n+/* Rewrite *LOC so that it refers to a default TLS address space. */\n+void\n+ix86_rewrite_tls_address_1 (rtx *loc)\n+{\n+ subrtx_ptr_iterator::array_type array;\n+ FOR_EACH_SUBRTX_PTR (iter, array, loc, ALL)\n+ {\n+ rtx *loc = *iter;\n+ if (MEM_P (*loc))\n+\t{\n+\t rtx addr = XEXP (*loc, 0);\n+\t rtx *x = &addr;\n+\t while (GET_CODE (*x) == PLUS)\n+\t {\n+\t int i;\n+\t for (i = 0; i < 2; i++)\n+\t\t{\n+\t\t rtx u = XEXP (*x, i);\n+\t\t if (GET_CODE (u) == ZERO_EXTEND)\n+\t\t u = XEXP (u, 0);\n+\t\t if (GET_CODE (u) == UNSPEC\n+\t\t && XINT (u, 1) == UNSPEC_TP)\n+\t\t {\n+\t\t addr_space_t as = DEFAULT_TLS_SEG_REG;\n+\n+\t\t *x = XEXP (*x, 1 - i);\n+\n+\t\t *loc = replace_equiv_address_nv (*loc, addr, true);\n+\t\t set_mem_addr_space (*loc, as);\n+\t\t return;\n+\t\t }\n+\t\t}\n+\t x = &XEXP (*x, 0);\n+\t }\n+\n+\t iter.skip_subrtxes ();\n+\t}\n+ }\n+}\n+\n+/* Rewrite instruction pattern involvning TLS address\n+ so that it refers to a default TLS address space. */\n+rtx\n+ix86_rewrite_tls_address (rtx pattern)\n+{\n+ pattern = copy_insn (pattern);\n+ ix86_rewrite_tls_address_1 (&pattern);\n+ return pattern;\n+}\n+\n /* Create or return the unique __imp_DECL dllimport symbol corresponding\n to symbol DECL if BEIMPORT is true. Otherwise create or return the\n unique refptr-DECL symbol corresponding to symbol DECL. */\nIndex: config/i386/i386.md\n===================================================================\n--- config/i386/i386.md\t(revision 251566)\n+++ config/i386/i386.md\t(working copy)\n@@ -14143,6 +14143,13 @@\n operands[4] = can_create_pseudo_p () ? gen_reg_rtx (Pmode) : operands[0];\n emit_insn (gen_tls_dynamic_gnu2_64 (operands[4], operands[1]));\n })\n+\n+(define_split\n+ [(match_operand 0 \"tls_address_pattern\")]\n+ \"TARGET_TLS_DIRECT_SEG_REFS\"\n+ [(match_dup 0)]\n+ \"operands[0] = ix86_rewrite_tls_address (operands[0]);\")\n+\n \f\n ;; These patterns match the binary 387 instructions for addM3, subM3,\n ;; mulM3 and divM3. There are three patterns for each of DFmode and\nIndex: config/i386/predicates.md\n===================================================================\n--- config/i386/predicates.md\t(revision 251566)\n+++ config/i386/predicates.md\t(working copy)\n@@ -567,6 +567,10 @@\n (and (match_code \"symbol_ref\")\n (match_test \"op == ix86_tls_module_base ()\")))\n \n+(define_predicate \"tls_address_pattern\"\n+ (and (match_code \"set,parallel,unspec,unspec_volatile\")\n+ (match_test \"ix86_tls_address_pattern_p (op)\")))\n+\n ;; Test for a pc-relative call operand\n (define_predicate \"constant_call_address_operand\"\n (match_code \"symbol_ref\")\n", "prefixes": [ "RFC", "i386" ] }