From 3204ae674bc26fbfc74501a1ff93c2ac5e124fa0 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Mon, 23 Nov 2009 22:27:30 +0100 Subject: [PATCH] re PR target/42113 (Internal Compiler error with -O3, breaking commit known) PR target/42113 * config/alpha/alpha.md (*cmp_sadd_si): Change mode of scratch register to SImode. (*cmp_sadd_sidi): Ditto. (*cmp_ssub_si): Ditto. (*cmp_ssub_sidi): Ditto. testsuite/ChangeLog: PR target/42113 * gcc.target/alpha/pr42113.c: New test. From-SVN: r154465 --- gcc/ChangeLog | 9 +++++++++ gcc/config/alpha/alpha.md | 12 ++++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/alpha/pr42113.c | 12 ++++++++++++ 4 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.target/alpha/pr42113.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6b8bb8da5e76..ddced7de0373 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-11-23 Uros Bizjak + + PR target/42113 + * config/alpha/alpha.md (*cmp_sadd_si): Change mode + of scratch register to SImode. + (*cmp_sadd_sidi): Ditto. + (*cmp_ssub_si): Ditto. + (*cmp_ssub_sidi): Ditto. + 2009-11-17 Ulrich Weigand * config/spu/spu.c (get_pic_reg): Use LAST_ARG_REGNUM as PIC diff --git a/gcc/config/alpha/alpha.md b/gcc/config/alpha/alpha.md index 831a6983b669..72a8f2f2685e 100644 --- a/gcc/config/alpha/alpha.md +++ b/gcc/config/alpha/alpha.md @@ -4349,7 +4349,7 @@ (match_dup 4)))] { if (can_create_pseudo_p ()) - operands[5] = gen_reg_rtx (DImode); + operands[5] = gen_reg_rtx (SImode); else if (reg_overlap_mentioned_p (operands[5], operands[4])) operands[5] = operands[0]; }) @@ -4375,9 +4375,9 @@ (match_dup 4))))] { if (can_create_pseudo_p ()) - operands[5] = gen_reg_rtx (DImode); + operands[5] = gen_reg_rtx (SImode); else if (reg_overlap_mentioned_p (operands[5], operands[4])) - operands[5] = operands[0]; + operands[5] = gen_lowpart (SImode, operands[0]); }) (define_insn_and_split "*cmp_ssub_di" @@ -4425,7 +4425,7 @@ (match_dup 4)))] { if (can_create_pseudo_p ()) - operands[5] = gen_reg_rtx (DImode); + operands[5] = gen_reg_rtx (SImode); else if (reg_overlap_mentioned_p (operands[5], operands[4])) operands[5] = operands[0]; }) @@ -4451,9 +4451,9 @@ (match_dup 4))))] { if (can_create_pseudo_p ()) - operands[5] = gen_reg_rtx (DImode); + operands[5] = gen_reg_rtx (SImode); else if (reg_overlap_mentioned_p (operands[5], operands[4])) - operands[5] = operands[0]; + operands[5] = gen_lowpart (SImode, operands[0]); }) ;; Here are the CALL and unconditional branch insns. Calls on NT and OSF diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6a7b77ad0b15..787834528210 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-11-23 Uros Bizjak + + PR target/42113 + * gcc.target/alpha/pr42113.c: New test. + 2009-11-20 Jerry DeLisle PR libgfortran/42090 diff --git a/gcc/testsuite/gcc.target/alpha/pr42113.c b/gcc/testsuite/gcc.target/alpha/pr42113.c new file mode 100644 index 000000000000..228c14abb64c --- /dev/null +++ b/gcc/testsuite/gcc.target/alpha/pr42113.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +int foo (int a, int b) +{ + int bar = a * sizeof (int); + + if (b) + bar += sizeof (int); + + return bar; +} -- 2.47.2