From patchwork Thu Nov 1 18:58:01 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Makarov X-Patchwork-Id: 196333 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id C31E62C00E1 for ; Fri, 2 Nov 2012 06:05:06 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1352401508; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Message-ID:Date:From:User-Agent:MIME-Version:To:Subject: Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=L/ZAjIn LrNljdgB9dRruo8XTdWg=; b=dp8ThkxChtfkikmXYynKEfRLcvg/y51bUztVLka EVhMb4sV7zJVW5nbb0KlJSYEA6TnGb+QktrQ8vUBZNUqDnXmxZYZ6UzDFt6+XipI 8voAV4t1wZIiQybAkL1RMeJFEMSOu6nSQ9KwMqCV3v8iJBaVMJ3vJRxAlW247wUY vvrE= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=Vk4NZJIWZBM7X3hDs2Qq/gz/g4tLsKaxtpR4LeWx7vd3rxV6mGXBpT3pXgL3CF ikvF9gDuUXPgnt9LMXfilrxlkAP88dABYOS/0HcvyNcLRaiUDS+lNusA6t4LXGUe TnN+Mn5qDekdXI6g3obWfxauctHXeeKTdsBvWOQUPY5cI=; Received: (qmail 11454 invoked by alias); 1 Nov 2012 19:05:01 -0000 Received: (qmail 11437 invoked by uid 22791); 1 Nov 2012 19:05:00 -0000 X-SWARE-Spam-Status: No, hits=-6.6 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, MAY_BE_FORGED, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, RP_MATCHES_RCVD, SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 01 Nov 2012 19:04:38 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id qA1J4cab022364 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 1 Nov 2012 15:04:38 -0400 Received: from toll.usersys.redhat.com (unused [10.15.16.165] (may be forged)) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id qA1J4blC026218 for ; Thu, 1 Nov 2012 15:04:38 -0400 Message-ID: <5092C639.8070605@redhat.com> Date: Thu, 01 Nov 2012 14:58:01 -0400 From: Vladimir Makarov User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121009 Thunderbird/16.0 MIME-Version: 1.0 To: gcc-patches Subject: patch to fix PR55150 X-IsSubscribed: yes 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 The following patch fixes the second test of PR55150 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55150 The patch was successfully bootstrapped on x86/x86-64. Committed as rev. 193065. 2012-11-01 Vladimir Makarov PR middle-end/55150 * lra-constraints.c (lra_constraints): Check only pseudos with equivalences. Add insns with equivalence pseudos. 2012-11-01 Vladimir Makarov PR middle-end/55150 * gcc.dg/pr55150.c: Rename to gcc.dg/pr55150-1.c. * gcc.dg/pr55150-2.c: New test. Index: lra-constraints.c =================================================================== --- lra-constraints.c (revision 193064) +++ lra-constraints.c (working copy) @@ -3244,9 +3244,11 @@ lra_constraints (bool first_p) { bool changed_p; int i, hard_regno, new_insns_num; - unsigned int min_len, new_min_len; - rtx set, x, dest_reg; + unsigned int min_len, new_min_len, uid; + rtx set, x, reg, dest_reg; basic_block last_bb; + bitmap_head equiv_insn_bitmap; + bitmap_iterator bi; lra_constraint_iter++; if (lra_dump_file != NULL) @@ -3261,10 +3263,12 @@ lra_constraints (bool first_p) lra_risky_transformations_p = false; new_insn_uid_start = get_max_uid (); new_regno_start = first_p ? lra_constraint_new_regno_start : max_reg_num (); + bitmap_initialize (&equiv_insn_bitmap, ®_obstack); for (i = FIRST_PSEUDO_REGISTER; i < new_regno_start; i++) if (lra_reg_info[i].nrefs != 0) { ira_reg_equiv[i].profitable_p = true; + reg = regno_reg_rtx[i]; if ((hard_regno = lra_get_regno_hard_regno (i)) >= 0) { int j, nregs = hard_regno_nregs[hard_regno][PSEUDO_REGNO_MODE (i)]; @@ -3272,7 +3276,7 @@ lra_constraints (bool first_p) for (j = 0; j < nregs; j++) df_set_regs_ever_live (hard_regno + j, true); } - else if ((x = get_equiv_substitution (regno_reg_rtx[i])) != NULL_RTX) + else if ((x = get_equiv_substitution (reg)) != reg) { bool pseudo_p = contains_reg_p (x, false, false); rtx set, insn; @@ -3310,8 +3314,15 @@ lra_constraints (bool first_p) ira_reg_equiv[i].defined_p = false; if (contains_reg_p (x, false, true)) ira_reg_equiv[i].profitable_p = false; + if (get_equiv_substitution (reg) != reg) + bitmap_ior_into (&equiv_insn_bitmap, &lra_reg_info[i].insn_bitmap); } } + /* We should add all insns containing pseudos which should be + substituted by their equivalences. */ + EXECUTE_IF_SET_IN_BITMAP (&equiv_insn_bitmap, 0, uid, bi) + lra_push_insn_by_uid (uid); + bitmap_clear (&equiv_insn_bitmap); lra_eliminate (false); min_len = lra_insn_stack_length (); new_insns_num = 0; Index: testsuite/gcc.dg/pr55150-1.c =================================================================== --- testsuite/gcc.dg/pr55150-1.c (revision 0) +++ testsuite/gcc.dg/pr55150-1.c (working copy) @@ -0,0 +1,72 @@ +/* PR middle-end/55150 */ +/* { dg-do compile } */ +/* { dg-options "-Os -g" } */ + +typedef unsigned int KEY_TABLE_TYPE[(272 / 4)]; + typedef unsigned int u32; + typedef unsigned char u8; + static const u32 Camellia_SBOX[][256] = { + }; + static const u32 SIGMA[] = { + 0xa09e667f, 0x3bcc908b, 0xb67ae858, 0x4caa73b2, 0xc6ef372f, 0xe94f82be, 0x54ff53a5, 0xf1d36f1c, 0x10e527fa, 0xde682d1d, 0xb05688c2, 0xb3e6c1fd }; + int Camellia_Ekeygen (int keyBitLength, const u8 * rawKey, KEY_TABLE_TYPE k) { + register u32 s0, s1, s2, s3; + k[0] = s0 = ( { + u32 r = *(const u32 *) (rawKey); + r; + } + ); + k[2] = s2 = ( { + u32 r = *(const u32 *) (rawKey + 8); + r; + } + ); + k[3] = s3 = ( { + u32 r = *(const u32 *) (rawKey + 12); + r; + } + ); + if (keyBitLength != 128) { + k[8] = s0 = ( { + u32 r = *(const u32 *) (rawKey + 16); + r; + } + ); + if (keyBitLength == 192) { + k[10] = s2 = ~s0; + k[11] = s3 = ~s1; + } + } + s0 ^= k[0], s1 ^= k[1], s2 ^= k[2], s3 ^= k[3]; + if (keyBitLength == 128) { + k[4] = s0, k[5] = s1, k[6] = s2, k[7] = s3; + } + else { + k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3; + s0 ^= k[8], s1 ^= k[9], s2 ^= k[10], s3 ^= k[11]; + do { + register u32 _t0, _t1, _t2, _t3; + _t0 = s2 ^ ((SIGMA + 10))[0]; + _t3 ^= Camellia_SBOX[3][(_t0 >> 8) & 0xff]; + s1 ^= _t3; + } + while (0); + do { + u32 _t0 = s0 >> (32 - 30); + s2 = (s2 << 30) | (s3 >> (32 - 30)); + s3 = (s3 << 30) | _t0; + } + while (0); + k[40] = s0, k[41] = s1, k[42] = s2, k[43] = s3; + k[64] = s1, k[65] = s2, k[66] = s3, k[67] = s0; + s0 = k[8], s1 = k[9], s2 = k[10], s3 = k[11]; + k[36] = s0, k[37] = s1, k[38] = s2, k[39] = s3; + s0 = k[12], s1 = k[13], s2 = k[14], s3 = k[15]; + do { + s1 = (s1 << 15) | (s2 >> (32 - 15)); + } + while (0); + k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3; + k[44] = s1, k[45] = s2, k[46] = s3, k[47] = s0; + } + } Index: testsuite/gcc.dg/pr55150-2.c =================================================================== --- testsuite/gcc.dg/pr55150-2.c (revision 0) +++ testsuite/gcc.dg/pr55150-2.c (working copy) @@ -0,0 +1,53 @@ +/* PR middle-end/55150 */ +/* { dg-do compile } */ +/* { dg-options "-Os -g -fPIC" } */ + +typedef unsigned char DES_cblock[8]; + typedef struct DES_ks { + } + DES_key_schedule; + void DES_ede3_cbcm_encrypt (const unsigned char *in, unsigned char *out, long length, DES_key_schedule * ks1, DES_key_schedule * ks2, DES_key_schedule * ks3, DES_cblock * ivec1, DES_cblock * ivec2, int enc) { + register unsigned long tout0, tout1, xor0, xor1, m0, m1; + register long l = length; + unsigned long tin[2]; + unsigned char *iv1, *iv2; + iv1 = &(*ivec1)[0]; + iv2 = &(*ivec2)[0]; + if (enc) { + (m0 = ((unsigned long) (*((iv1)++))), m0 |= ((unsigned long) (*((iv1)++))) << 8L, m0 |= ((unsigned long) (*((iv1)++))) << 16L, m0 |= ((unsigned long) (*((iv1)++))) << 24L); + (m1 = ((unsigned long) (*((iv1)++))), m1 |= ((unsigned long) (*((iv1)++))) << 8L, m1 |= ((unsigned long) (*((iv1)++))) << 16L, m1 |= ((unsigned long) (*((iv1)++))) << 24L); + (tout0 = ((unsigned long) (*((iv2)++))), tout0 |= ((unsigned long) (*((iv2)++))) << 8L, tout0 |= ((unsigned long) (*((iv2)++))) << 16L, tout0 |= ((unsigned long) (*((iv2)++))) << 24L); + for (l -= 8; + l >= -7; + l -= 8) { + DES_encrypt1 (tin, ks3, 1); + DES_encrypt1 (tin, ks1, 1); + } + (*((iv1)++) = (unsigned char) (((m0)) & 0xff), *((iv1)++) = (unsigned char) (((m0) >> 8L) & 0xff), *((iv1)++) = (unsigned char) (((m0) >> 16L) & 0xff), *((iv1)++) = (unsigned char) (((m0) >> 24L) & 0xff)); + (*((iv1)++) = (unsigned char) (((m1)) & 0xff), *((iv1)++) = (unsigned char) (((m1) >> 8L) & 0xff), *((iv1)++) = (unsigned char) (((m1) >> 16L) & 0xff), *((iv1)++) = (unsigned char) (((m1) >> 24L) & 0xff)); + (*((iv2)++) = (unsigned char) (((tout0)) & 0xff), *((iv2)++) = (unsigned char) (((tout0) >> 8L) & 0xff), *((iv2)++) = (unsigned char) (((tout0) >> 16L) & 0xff), *((iv2)++) = (unsigned char) (((tout0) >> 24L) & 0xff)); + } + else { + (m0 = ((unsigned long) (*((iv1)++))), m0 |= ((unsigned long) (*((iv1)++))) << 8L, m0 |= ((unsigned long) (*((iv1)++))) << 16L, m0 |= ((unsigned long) (*((iv1)++))) << 24L); + (xor1 = ((unsigned long) (*((iv2)++))), xor1 |= ((unsigned long) (*((iv2)++))) << 8L, xor1 |= ((unsigned long) (*((iv2)++))) << 16L, xor1 |= ((unsigned long) (*((iv2)++))) << 24L); + for (l -= 8; + l >= -7; + l -= 8) { + DES_encrypt1 (tin, ks3, 1); + if (l < 0) { + { + switch (l + 8) { + case 7: *(--(out)) = (unsigned char) (((tout1) >> 16L) & 0xff); + case 6: *(--(out)) = (unsigned char) (((tout1) >> 8L) & 0xff); + case 5: *(--(out)) = (unsigned char) (((tout1)) & 0xff); + case 4: *(--(out)) = (unsigned char) (((tout0) >> 24L) & 0xff); + case 1: *(--(out)) = (unsigned char) (((tout0)) & 0xff); + } + }; + } + } + (*((iv1)++) = (unsigned char) (((m0)) & 0xff), *((iv1)++) = (unsigned char) (((m0) >> 8L) & 0xff), *((iv1)++) = (unsigned char) (((m0) >> 16L) & 0xff), *((iv1)++) = (unsigned char) (((m0) >> 24L) & 0xff)); + (*((iv2)++) = (unsigned char) (((xor0)) & 0xff), *((iv2)++) = (unsigned char) (((xor0) >> 8L) & 0xff), *((iv2)++) = (unsigned char) (((xor0) >> 16L) & 0xff), *((iv2)++) = (unsigned char) (((xor0) >> 24L) & 0xff)); + (*((iv2)++) = (unsigned char) (((xor1)) & 0xff), *((iv2)++) = (unsigned char) (((xor1) >> 8L) & 0xff), *((iv2)++) = (unsigned char) (((xor1) >> 16L) & 0xff), *((iv2)++) = (unsigned char) (((xor1) >> 24L) & 0xff)); + } + } Index: testsuite/gcc.dg/pr55150.c =================================================================== --- testsuite/gcc.dg/pr55150.c (revision 193064) +++ testsuite/gcc.dg/pr55150.c (working copy) @@ -1,72 +0,0 @@ -/* PR middle-end/55150 */ -/* { dg-do compile } */ -/* { dg-options "-Os -g" } */ - -typedef unsigned int KEY_TABLE_TYPE[(272 / 4)]; - typedef unsigned int u32; - typedef unsigned char u8; - static const u32 Camellia_SBOX[][256] = { - }; - static const u32 SIGMA[] = { - 0xa09e667f, 0x3bcc908b, 0xb67ae858, 0x4caa73b2, 0xc6ef372f, 0xe94f82be, 0x54ff53a5, 0xf1d36f1c, 0x10e527fa, 0xde682d1d, 0xb05688c2, 0xb3e6c1fd }; - int Camellia_Ekeygen (int keyBitLength, const u8 * rawKey, KEY_TABLE_TYPE k) { - register u32 s0, s1, s2, s3; - k[0] = s0 = ( { - u32 r = *(const u32 *) (rawKey); - r; - } - ); - k[2] = s2 = ( { - u32 r = *(const u32 *) (rawKey + 8); - r; - } - ); - k[3] = s3 = ( { - u32 r = *(const u32 *) (rawKey + 12); - r; - } - ); - if (keyBitLength != 128) { - k[8] = s0 = ( { - u32 r = *(const u32 *) (rawKey + 16); - r; - } - ); - if (keyBitLength == 192) { - k[10] = s2 = ~s0; - k[11] = s3 = ~s1; - } - } - s0 ^= k[0], s1 ^= k[1], s2 ^= k[2], s3 ^= k[3]; - if (keyBitLength == 128) { - k[4] = s0, k[5] = s1, k[6] = s2, k[7] = s3; - } - else { - k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3; - s0 ^= k[8], s1 ^= k[9], s2 ^= k[10], s3 ^= k[11]; - do { - register u32 _t0, _t1, _t2, _t3; - _t0 = s2 ^ ((SIGMA + 10))[0]; - _t3 ^= Camellia_SBOX[3][(_t0 >> 8) & 0xff]; - s1 ^= _t3; - } - while (0); - do { - u32 _t0 = s0 >> (32 - 30); - s2 = (s2 << 30) | (s3 >> (32 - 30)); - s3 = (s3 << 30) | _t0; - } - while (0); - k[40] = s0, k[41] = s1, k[42] = s2, k[43] = s3; - k[64] = s1, k[65] = s2, k[66] = s3, k[67] = s0; - s0 = k[8], s1 = k[9], s2 = k[10], s3 = k[11]; - k[36] = s0, k[37] = s1, k[38] = s2, k[39] = s3; - s0 = k[12], s1 = k[13], s2 = k[14], s3 = k[15]; - do { - s1 = (s1 << 15) | (s2 >> (32 - 15)); - } - while (0); - k[12] = s0, k[13] = s1, k[14] = s2, k[15] = s3; - k[44] = s1, k[45] = s2, k[46] = s3, k[47] = s0; - } - }