From patchwork Sun Oct 29 07:38:31 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Uros Bizjak X-Patchwork-Id: 831669 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-465413-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="ZQLAG6Jt"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yPqHL0sLVz9sPt for ; Sun, 29 Oct 2017 18:38:49 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:from:date:message-id:subject:to:cc:content-type; q=dns; s=default; b=F8qVS3CV0jdfkGfoiq+SlI2rFDScP4JsaGZBJLofopi Hni6LDSTb6jyuAy7mSi9Mr8+3QP1XGYatsRihJW3daSZ3lPzsYYCsfOsRyn18rUO LoNnX587zQFkyAqrYYRfzKkRgeQOOn3HG1iYwp5MqDNkIy4axYc8LzreTEPHGxDM = DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:from:date:message-id:subject:to:cc:content-type; s=default; bh=yC90QGMbaDt2w2zjuEeuqTbz8AE=; b=ZQLAG6JtSgJiFsf/R ec0uNGMKIAsSULq4l2fPodbDJPrWNlVeVXsGg8p5435z4SPkWLRKqU+IAmRUJ9LA KpL6ZeFsr5MElSgMWFgV9nHFR/JXAu4HgTE01+6jrMXojQTTd4NSudRIsd64lmYI 8lD4G1R4cfnb8JQrBTkaRpGwhY= Received: (qmail 76713 invoked by alias); 29 Oct 2017 07:38:38 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 75421 invoked by uid 89); 29 Oct 2017 07:38:36 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-10.7 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy=hello! X-HELO: mail-io0-f173.google.com Received: from mail-io0-f173.google.com (HELO mail-io0-f173.google.com) (209.85.223.173) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 29 Oct 2017 07:38:34 +0000 Received: by mail-io0-f173.google.com with SMTP id f20so20781788ioj.9 for ; Sun, 29 Oct 2017 00:38:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to:cc; bh=UPXw8cxZDc0s/N4IMdHNxWX4Ra2fbIRkuEHbCWXz5n8=; b=j4xMnosRpXmnPsmKClBSNGaN3m3Yy8VVy27wEBW3HfMb7+JGxEIkpnUN0tSB6C/mp2 y7MebtDWDNm5+Jum+HesKFA1WHy2Kp8EgjN5nQbcM1e65/DJwnC/Z3DVMfzLjAjpnkd0 LSaCHnTjBsr4ktc7IHbKc6zVshw+douT/xQEW6iPpQ+ngoVK48weAbnJjzvRoXoM6Kt5 YpYpBxuG9UYWzS05TypveqHxhZIGnuMJ2Ryk2MqR0LIdzK/A97UWYFH+i/LKbAI0/y61 btbsabgwX9BlzgM30Qu2qyd6QQLIQviFRT8ocdXd8mu/riKhtNO1QZVhBU/NS/DhzFY0 RfRQ== X-Gm-Message-State: AMCzsaXH8FO19x0kaDM40sBIXnLFEvrAA+RP8r0xM/i4qhceG2caTL38 TeT9J4leUaNcIPt+USjKgaO6fE3CW3ogzN/AqSTbBw== X-Google-Smtp-Source: ABhQp+SjjTVGYxF0OQ9frBdg3bFjbNKAb7vf1yIYF5eLTY5NuP+AucmEBNSXVgwjZLY+6oLslA8vG8rMl0+vU8lr4mA= X-Received: by 10.36.121.150 with SMTP id z144mr1570622itc.28.1509262712635; Sun, 29 Oct 2017 00:38:32 -0700 (PDT) MIME-Version: 1.0 Received: by 10.2.74.18 with HTTP; Sun, 29 Oct 2017 00:38:31 -0700 (PDT) From: Uros Bizjak Date: Sun, 29 Oct 2017 08:38:31 +0100 Message-ID: Subject: [PATCH, i386]: Fix PR82725, ICE in change_address_1, at emit-rtl.c To: "gcc-patches@gcc.gnu.org" Cc: Jakub Jelinek , "H. J. Lu" Hello! split_double_mode tries to split TImode address: (insn 10 2 11 2 (set (reg/i:TI 0 ax) (mem/u/c:TI (const:DI (unspec:DI [ (symbol_ref:DI ("_ZZ7tempDirvE5cache") [flags 0x2a]) ] UNSPEC_NTPOFF)) [1 cache+0 S16 A64 AS1])) to: (const:DI (unspec:DI [ (symbol_ref:DI ("_ZZ7tempDirvE5cache") [flags 0x2a]) ] UNSPEC_NTPOFF)) and (const:DI (plus:DI (unspec:DI [ (symbol_ref:DI ("_ZZ7tempDirvE5cache") [flags 0x2a]) ] UNSPEC_NTPOFF) (const_int 8 [0x8]))) but the later RTX is not recognized as a valid address. Attached patch allows offsetted UNSPEC_DTPOFF/UNSPEC_NTPOFF relocations in legitimate_pic_address_disp_p. In fact, these are already allowed in x86_64_immediate_operand, with the immediate limited to SImode values. 2017-10-29 Uros Bizjak PR target/82725 * config/i386/i386.c (legitimate_pic_address_disp_p): Allow UNSPEC_DTPOFF and UNSPEC_NTPOFF with SImode immediate offset. testsuite/ChangeLog: 2017-10-29 Uros Bizjak PR target/82725 * g++.dg/pr82725.C: New test. Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Jakub, HJ, do you have any comments on the patch? Uros. Index: config/i386/i386.c =================================================================== --- config/i386/i386.c (revision 254199) +++ config/i386/i386.c (working copy) @@ -15079,10 +15079,16 @@ legitimate_pic_address_disp_p (rtx disp) break; op0 = XEXP (XEXP (disp, 0), 0); op1 = XEXP (XEXP (disp, 0), 1); - if (!CONST_INT_P (op1) - || INTVAL (op1) >= 16*1024*1024 + if (!CONST_INT_P (op1)) + break; + if (GET_CODE (op0) == UNSPEC + && (XINT (op0, 1) == UNSPEC_DTPOFF + || XINT (op0, 1) == UNSPEC_NTPOFF) + && trunc_int_for_mode (INTVAL (op1), SImode) == INTVAL (op1)) + return true; + if (INTVAL (op1) >= 16*1024*1024 || INTVAL (op1) < -16*1024*1024) - break; + break; if (GET_CODE (op0) == LABEL_REF) return true; if (GET_CODE (op0) == CONST Index: testsuite/g++.dg/pr82725.C =================================================================== --- testsuite/g++.dg/pr82725.C (nonexistent) +++ testsuite/g++.dg/pr82725.C (working copy) @@ -0,0 +1,16 @@ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +// { dg-require-effective-target pie } +// { dg-options "-O2 -fpie -mtls-direct-seg-refs" } + +struct string +{ + __SIZE_TYPE__ length; + const char *ptr; +}; + +string +tempDir () +{ + thread_local string cache; + return cache; +}