From 51c2edaa7fea5d000633dfbc3bdedf96dacea846 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Sat, 27 Jun 2015 11:16:42 +0200 Subject: [PATCH] re PR target/66412 (ICE on valid code at -O2 and -O3 with -g enabled in simplify_subreg, at simplify-rtx.c:5748) PR target/66412 * config/i386/i386.md (various splitters): Use shallow_copy_rtx before doing PUT_MODE or PUT_CODE on operands to avoid in-place RTX modification. testsuite/ChangeLog: PR target/66412 * gcc.target/i386/pr66412.c: New test. Co-Authored-By: Segher Boessenkool From-SVN: r225096 --- gcc/ChangeLog | 8 +++ gcc/config/i386/i386.md | 68 +++++++++++++++---------- gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gcc.target/i386/pr66412.c | 17 +++++++ 4 files changed, 72 insertions(+), 26 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr66412.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 85c77041330e..7aacc415b56f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-06-27 Uros Bizjak + Segher Boessenkool + + PR target/66412 + * config/i386/i386.md (various splitters): Use shallow_copy_rtx + before doing PUT_MODE or PUT_CODE on operands to avoid + in-place RTX modification. + 2015-06-26 Jakub Jelinek * BASE-VER: Set to 4.9.4. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 4584bbb8b5ab..b43044384279 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -10518,6 +10518,7 @@ [(set (match_dup 2) (match_dup 1)) (set (match_dup 0) (zero_extend:DI (match_dup 2)))] { + operands[1] = shallow_copy_rtx (operands[1]); PUT_MODE (operands[1], QImode); operands[2] = gen_lowpart (QImode, operands[0]); }) @@ -10535,6 +10536,7 @@ (parallel [(set (match_dup 0) (zero_extend:SI (match_dup 2))) (clobber (reg:CC FLAGS_REG))])] { + operands[1] = shallow_copy_rtx (operands[1]); PUT_MODE (operands[1], QImode); operands[2] = gen_lowpart (QImode, operands[0]); }) @@ -10550,6 +10552,7 @@ [(set (match_dup 2) (match_dup 1)) (set (match_dup 0) (zero_extend:SI (match_dup 2)))] { + operands[1] = shallow_copy_rtx (operands[1]); PUT_MODE (operands[1], QImode); operands[2] = gen_lowpart (QImode, operands[0]); }) @@ -10587,7 +10590,10 @@ (const_int 0)))] "" [(set (match_dup 0) (match_dup 1))] - "PUT_MODE (operands[1], QImode);") +{ + operands[1] = shallow_copy_rtx (operands[1]); + PUT_MODE (operands[1], QImode); +}) (define_split [(set (strict_low_part (match_operand:QI 0 "nonimmediate_operand")) @@ -10596,7 +10602,10 @@ (const_int 0)))] "" [(set (match_dup 0) (match_dup 1))] - "PUT_MODE (operands[1], QImode);") +{ + operands[1] = shallow_copy_rtx (operands[1]); + PUT_MODE (operands[1], QImode); +}) (define_split [(set (match_operand:QI 0 "nonimmediate_operand") @@ -10606,15 +10615,15 @@ "" [(set (match_dup 0) (match_dup 1))] { - rtx new_op1 = copy_rtx (operands[1]); - operands[1] = new_op1; - PUT_MODE (new_op1, QImode); - PUT_CODE (new_op1, ix86_reverse_condition (GET_CODE (new_op1), - GET_MODE (XEXP (new_op1, 0)))); + operands[1] = shallow_copy_rtx (operands[1]); + PUT_MODE (operands[1], QImode); + PUT_CODE (operands[1], + ix86_reverse_condition (GET_CODE (operands[1]), + GET_MODE (XEXP (operands[1], 0)))); /* Make sure that (a) the CCmode we have for the flags is strong enough for the reversed compare or (b) we have a valid FP compare. */ - if (! ix86_comparison_operator (new_op1, VOIDmode)) + if (! ix86_comparison_operator (operands[1], VOIDmode)) FAIL; }) @@ -10626,15 +10635,15 @@ "" [(set (match_dup 0) (match_dup 1))] { - rtx new_op1 = copy_rtx (operands[1]); - operands[1] = new_op1; - PUT_MODE (new_op1, QImode); - PUT_CODE (new_op1, ix86_reverse_condition (GET_CODE (new_op1), - GET_MODE (XEXP (new_op1, 0)))); + operands[1] = shallow_copy_rtx (operands[1]); + PUT_MODE (operands[1], QImode); + PUT_CODE (operands[1], + ix86_reverse_condition (GET_CODE (operands[1]), + GET_MODE (XEXP (operands[1], 0)))); /* Make sure that (a) the CCmode we have for the flags is strong enough for the reversed compare or (b) we have a valid FP compare. */ - if (! ix86_comparison_operator (new_op1, VOIDmode)) + if (! ix86_comparison_operator (operands[1], VOIDmode)) FAIL; }) @@ -10717,7 +10726,10 @@ (if_then_else (match_dup 0) (label_ref (match_dup 1)) (pc)))] - "PUT_MODE (operands[0], VOIDmode);") +{ + operands[0] = shallow_copy_rtx (operands[0]); + PUT_MODE (operands[0], VOIDmode); +}) (define_split [(set (pc) @@ -10732,15 +10744,15 @@ (label_ref (match_dup 1)) (pc)))] { - rtx new_op0 = copy_rtx (operands[0]); - operands[0] = new_op0; - PUT_MODE (new_op0, VOIDmode); - PUT_CODE (new_op0, ix86_reverse_condition (GET_CODE (new_op0), - GET_MODE (XEXP (new_op0, 0)))); + operands[0] = shallow_copy_rtx (operands[0]); + PUT_MODE (operands[0], VOIDmode); + PUT_CODE (operands[0], + ix86_reverse_condition (GET_CODE (operands[0]), + GET_MODE (XEXP (operands[0], 0)))); /* Make sure that (a) the CCmode we have for the flags is strong enough for the reversed compare or (b) we have a valid FP compare. */ - if (! ix86_comparison_operator (new_op0, VOIDmode)) + if (! ix86_comparison_operator (operands[0], VOIDmode)) FAIL; }) @@ -10777,7 +10789,7 @@ (pc)))] { operands[2] = simplify_gen_subreg (mode, operands[2], QImode, 0); - + operands[0] = shallow_copy_rtx (operands[0]); PUT_CODE (operands[0], reverse_condition (GET_CODE (operands[0]))); }) @@ -10810,7 +10822,7 @@ (pc)))] { operands[2] = simplify_gen_subreg (mode, operands[2], SImode, 0); - + operands[0] = shallow_copy_rtx (operands[0]); PUT_CODE (operands[0], reverse_condition (GET_CODE (operands[0]))); }) @@ -10846,7 +10858,7 @@ (pc)))] { operands[2] = simplify_gen_subreg (mode, operands[2], SImode, 0); - + operands[0] = shallow_copy_rtx (operands[0]); PUT_CODE (operands[0], reverse_condition (GET_CODE (operands[0]))); }) @@ -10878,7 +10890,7 @@ (pc)))] { operands[2] = simplify_gen_subreg (SImode, operands[2], QImode, 0); - + operands[0] = shallow_copy_rtx (operands[0]); PUT_CODE (operands[0], reverse_condition (GET_CODE (operands[0]))); }) @@ -10914,7 +10926,10 @@ (if_then_else (match_op_dup 0 [(reg:CCC FLAGS_REG) (const_int 0)]) (label_ref (match_dup 4)) (pc)))] - "PUT_CODE (operands[0], reverse_condition (GET_CODE (operands[0])));") +{ + operands[0] = shallow_copy_rtx (operands[0]); + PUT_CODE (operands[0], reverse_condition (GET_CODE (operands[0]))); +}) ;; Define combination compare-and-branch fp compare instructions to help ;; combine. @@ -16721,6 +16736,7 @@ operands[1] = gen_lowpart (SImode, operands[1]); if (GET_CODE (operands[3]) != ASHIFT) operands[2] = gen_lowpart (SImode, operands[2]); + operands[3] = shallow_copy_rtx (operands[3]); PUT_MODE (operands[3], SImode); }) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7c1ea7ae23be..641bd1f62058 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-06-27 Uros Bizjak + + PR target/66412 + * gcc.target/i386/pr66412.c: New test. + 2015-06-26 Release Manager * GCC 4.9.3 released. diff --git a/gcc/testsuite/gcc.target/i386/pr66412.c b/gcc/testsuite/gcc.target/i386/pr66412.c new file mode 100644 index 000000000000..c0690dca53a1 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr66412.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -g" } */ + +int a, b, c, d; + +void +fn1 () +{ + short e; + unsigned short g; + + for (c = 0; c < 1; c++) + d = 0; + g = ((a == 0) ^ d) % 8; + e = g << 1; + b = e && 1; +} -- 2.47.2