From patchwork Fri Jan 12 18:41:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jozef Lawrynowicz X-Patchwork-Id: 860151 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-471038-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="AAGFKiKx"; 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 3zJBRb2rYzz9s9Y for ; Sat, 13 Jan 2018 05:41:46 +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=TIO0QelROgyP7R1VvTFRFSsdpKk+RbJqC6aKk86COxp BvYyc3QfVNh50XyWL1Ajq3p49lJqXuV2JstHNC2vbhJdstbpPhR0e7FzLPs6bxZf YYyayH/COu5pYDtvGj8G3hbEHt1fSlgPmC9U5mdzzEtodqAfMMGXl+fK/1VU/Py8 = 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=HpH9Vj6ONXCrhy4W0q+a4hyUmcA=; b=AAGFKiKx6FwTFB7Xu E+BabOvT0EBAuq++L7ZYBgZgrN6g/3J9Ih/YnZWMhaxcpEchE3Z2KnGr16VtwhlU 358vKqXVQfvoFqLOlSVpeB0jMQeudQ90sXenQSZtM3JNVE7PzpP0WSX4BBE93fC7 Oz8HhvIFV5rZzSXoftPPvfjkoM= Received: (qmail 106404 invoked by alias); 12 Jan 2018 18:41:39 -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 106391 invoked by uid 89); 12 Jan 2018 18:41:38 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=5166, Thoughts X-HELO: mail-ot0-f179.google.com Received: from mail-ot0-f179.google.com (HELO mail-ot0-f179.google.com) (74.125.82.179) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 12 Jan 2018 18:41:36 +0000 Received: by mail-ot0-f179.google.com with SMTP id r4so2007648oti.12 for ; Fri, 12 Jan 2018 10:41:36 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:sender:from:date:message-id:subject :to:cc; bh=0tOr+C1AVttROqTJ8qayudmfxLtx2lpXrNtplPe6iu0=; b=nRPzg6WavzjyKjG+NABcX345TZ2BNmTjBBsG64Ao+oQ/pEIp7YHpLdxcjZzQxH3X1s 0E8xr7i2iMcNiOkNe8wy9DnKvj2eKznhbE3clKGGfWvDP4/CmZnCUTZM0zw3vt+w/NCa KuSENdu9yYWe6Cknbh81mouv0/ZBA4yeEzRuF84EB3t9tWJOKDuRQuz6X1BFc/xuiuv4 Drn2ZYP1pNaF0eFP+kho9hBNDaHV8HijOF1jtGlo3DDj+c4GgBxqiA3ykiCBcWi5W4HA fL+vvDYpnGre0kL5bSp+2I7TbW+Kyr6hbYtWShBz939gGQIuLFuy000Pim4ZsM7msGWk ZIPw== X-Gm-Message-State: AKwxytdttP2JgxQHjTCMoOkweBMQN0sp57HYYZODIKQGiR7rb2eZj+HV od00XTIFGi3QT3UvTMFa52OWsJ2Rkj02SV4Sd6bNNg== X-Google-Smtp-Source: ACJfBouNqg38pw2TfpDZ1j2vTaW7SzapcHeCX20NmcJ0ADDsuAl7kWSssTmDjUIdxT1CA16XoTyo2kAfOLgwuVr4ATg= X-Received: by 10.157.0.70 with SMTP id 64mr1124239ota.268.1515782494797; Fri, 12 Jan 2018 10:41:34 -0800 (PST) MIME-Version: 1.0 Received: by 10.74.137.241 with HTTP; Fri, 12 Jan 2018 10:41:34 -0800 (PST) From: Jozef Lawrynowicz Date: Fri, 12 Jan 2018 18:41:34 +0000 Message-ID: Subject: [PATCH] [MSP430] PR79242: Implement Complex Partial Integers To: gcc-patches@gcc.gnu.org Cc: nickc@redhat.com Complex Partial Integers are unimplemented, resulting in an ICE when attempting to use them. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79242 This results in GCC7/8 for msp430-elf failing to build. typedef _Complex __int20 C; C foo (C x, C y) { return x + y; } (Thanks Jakub - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79242#c2) ../../gcc/testsuite/gcc.target/msp430/pr79242.c: In function 'foo': ../../gcc/testsuite/gcc.target/msp430/pr79242.c:8:1: internal compiler error: in make_decl_rtl, at varasm.c:1304 foo (C x, C y) ^~~ 0xc07b29 make_decl_rtl(tree_node*) ../../gcc/varasm.c:1303 0x67523c set_parm_rtl(tree_node*, rtx_def*) ../../gcc/cfgexpand.c:1274 0x79ffb9 expand_function_start(tree_node*) ../../gcc/function.c:5166 0x6800e1 execute ../../gcc/cfgexpand.c:6250 The attached patch defines a new complex mode for PARTIAL_INT. You may notice that genmodes.c:complex_class returns MODE_COMPLEX_INT for MODE_PARTIAL_INT rather than MODE_COMPLEX_PARTIAL_INT. I reviewed the uses of MODE_COMPLEX_INT and it doesn't looked like a Complex Partial Int requires any different behaviour to MODE_COMPLEX_INT. msp430_hard_regno_nregs now returns 2 for CPSImode, but I feel like this may be better handled in the front-end. PSImode is already defined to only use 1 register, so for a CPSI shouldn't the front-end should be able to work out that double the amount of registers are required? Thoughts? Without the definition for CPSI in msp430_hard_regno_nregs, rtlanal.c:subreg_get_info thinks that a CPSI requires 4 registers of size 2, instead of 2 registers of size 4. Successfully bootstrapped and tested for c,c++,fortran,lto,objc on x86_64-pc-linux-gnu with no regressions on gcc-7-branch. With this patch gcc-7-branch now builds for msp430-elf. A further bug prevents trunk from building for msp430-elf. If the attached patch is acceptable, I would appreciate if someone would commit it for me, as I do not have write access. From 31d8554ebb6afeb2d8f235cf3d3c262236aa5e32 Mon Sep 17 00:00:00 2001 From: Jozef Lawrynowicz Date: Fri, 12 Jan 2018 13:23:40 +0000 Subject: [PATCH] Add support for Complex Partial Integers - CPSImode 2018-01-XX Jozef Lawrynowicz gcc/ PR target/79242 * machmode.def: Define a complex mode for PARTIAL_INT. * genmodes.c (complex_class): Return MODE_COMPLEX_INT for MODE_PARTIAL_INT. * doc/rtl.texi: Document CSPImode. * config/msp430/msp430.c (msp430_hard_regno_nregs): Add CPSImode handling. (msp430_hard_regno_nregs_with_padding): Likewise. gcc/testsuite/ PR target/79242 * gcc.target/msp430/pr79242.c: New test. --- gcc/config/msp430/msp430.c | 4 ++++ gcc/doc/rtl.texi | 5 +++-- gcc/genmodes.c | 1 + gcc/machmode.def | 1 + gcc/testsuite/gcc.target/msp430/pr79242.c | 11 +++++++++++ 5 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/msp430/pr79242.c diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c index 710a97b..c1f0d5b 100644 --- a/gcc/config/msp430/msp430.c +++ b/gcc/config/msp430/msp430.c @@ -905,6 +905,8 @@ msp430_hard_regno_nregs (int regno ATTRIBUTE_UNUSED, { if (mode == PSImode && msp430x) return 1; + if (mode == CPSImode && msp430x) + return 2; return ((GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD); } @@ -927,6 +929,8 @@ msp430_hard_regno_nregs_with_padding (int regno ATTRIBUTE_UNUSED, { if (mode == PSImode) return 2; + if (mode == CPSImode) + return 4; return msp430_hard_regno_nregs (regno, mode); } diff --git a/gcc/doc/rtl.texi b/gcc/doc/rtl.texi index b02e5a1..ebe2a63 100644 --- a/gcc/doc/rtl.texi +++ b/gcc/doc/rtl.texi @@ -1291,10 +1291,11 @@ point values. The floating point values are in @code{QFmode}, @findex CDImode @findex CTImode @findex COImode -@item CQImode, CHImode, CSImode, CDImode, CTImode, COImode +@findex CPSImode +@item CQImode, CHImode, CSImode, CDImode, CTImode, COImode, CPSImode These modes stand for a complex number represented as a pair of integer values. The integer values are in @code{QImode}, @code{HImode}, -@code{SImode}, @code{DImode}, @code{TImode}, and @code{OImode}, +@code{SImode}, @code{DImode}, @code{TImode}, @code{OImode}, and @code{PSImode}, respectively. @findex BND32mode diff --git a/gcc/genmodes.c b/gcc/genmodes.c index e56c08b..2af6556 100644 --- a/gcc/genmodes.c +++ b/gcc/genmodes.c @@ -116,6 +116,7 @@ complex_class (enum mode_class c) switch (c) { case MODE_INT: return MODE_COMPLEX_INT; + case MODE_PARTIAL_INT: return MODE_COMPLEX_INT; case MODE_FLOAT: return MODE_COMPLEX_FLOAT; default: error ("no complex class for class %s", mode_class_names[c]); diff --git a/gcc/machmode.def b/gcc/machmode.def index afe6851..6c84488 100644 --- a/gcc/machmode.def +++ b/gcc/machmode.def @@ -243,6 +243,7 @@ UACCUM_MODE (UTA, 16, 64, 64); /* 64.64 */ /* Complex modes. */ COMPLEX_MODES (INT); +COMPLEX_MODES (PARTIAL_INT); COMPLEX_MODES (FLOAT); /* Decimal floating point modes. */ diff --git a/gcc/testsuite/gcc.target/msp430/pr79242.c b/gcc/testsuite/gcc.target/msp430/pr79242.c new file mode 100644 index 0000000..d7ff8d3 --- /dev/null +++ b/gcc/testsuite/gcc.target/msp430/pr79242.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { "*-*-*" } { "-mcpu=msp430" "-msmall" } { "" } } */ +/* { dg-options "-mcpu=msp430x" } */ + +typedef _Complex __int20 C; + +C +foo (C x, C y) +{ + return x + y; +} -- 2.7.4