public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Fix bug in simplify_ternary_operation
@ 2017-08-28 18:50 Tom de Vries
  2017-08-30  9:12 ` Tom de Vries
  2017-08-31 23:37 ` Jeff Law
  0 siblings, 2 replies; 7+ messages in thread
From: Tom de Vries @ 2017-08-28 18:50 UTC (permalink / raw)
  To: Jeff Law; +Cc: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 2395 bytes --]

Hi,

I think I found a bug in r17465:
...
>        * cse.c (simplify_ternary_operation): Handle more IF_THEN_ELSE
>        simplifications.
> 
> diff --git a/gcc/cse.c b/gcc/cse.c
> index e001597..3c27387 100644
> --- a/gcc/cse.c
> +++ b/gcc/cse.c
> @@ -4713,6 +4713,17 @@ simplify_ternary_operation (code, mode, op0_mode, op0, op1, op2)

Note: the parameters of simplify_ternary_operation have the following 
meaning:
...
/* Simplify CODE, an operation with result mode MODE and three operands,
    OP0, OP1, and OP2.  OP0_MODE was the mode of OP0 before it became
    a constant.  Return 0 if no simplifications is possible.  */

rtx
simplify_ternary_operation (code, mode, op0_mode, op0, op1, op2)
      enum rtx_code code;
      enum machine_mode mode, op0_mode;
      rtx op0, op1, op2;
...

>           && rtx_equal_p (XEXP (op0, 1), op1)
>           && rtx_equal_p (XEXP (op0, 0), op2))
>         return op2;
> +      else if (! side_effects_p (op0))
> +       {
> +         rtx temp;
> +         temp = simplify_relational_operation (GET_CODE (op0), op0_mode,
> +                                               XEXP (op0, 0), XEXP (op0, 1));

We're handling code == IF_THEN_ELSE here, so op0 is the condition, op1 
is the 'then expr' and op2 is the 'else expr'.

The parameters of simplify_relational_operation have the following meaning:
...
/* Like simplify_binary_operation except used for relational operators.
    MODE is the mode of the operands, not that of the result.  If MODE
    is VOIDmode, both operands must also be VOIDmode and we compare the
    operands in "infinite precision".

    If no simplification is possible, this function returns zero.
    Otherwise, it returns either const_true_rtx or const0_rtx.  */

rtx
simplify_relational_operation (code, mode, op0, op1)
      enum rtx_code code;
      enum machine_mode mode;
      rtx op0, op1;
...

The problem in the patch is that we use op0_mode argument for the mode 
parameter. The mode parameter of simplify_relational_operation needs to 
be the mode of the operands of the condition, while op0_mode is the mode 
of the condition.

Patch below fixes this on current trunk.

[ I found this by running into an ICE in 
gcc.c-torture/compile/pr28776-2.c for gcn target. I haven't been able to 
reproduce this with an upstream branch yet. ]

OK for trunk if bootstrap and reg-test for x86_64 succeeds?

Thanks,
- Tom


[-- Attachment #2: tmp.patch --]
[-- Type: text/x-patch, Size: 457 bytes --]

diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 0133d43..fbf979b 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -5567,8 +5567,6 @@ simplify_ternary_operation (enum rtx_code code, machine_mode mode,
 					      XEXP (op0, 0), XEXP (op0, 1));
 	    }
 
-	  if (cmp_mode == VOIDmode)
-	    cmp_mode = op0_mode;
 	  temp = simplify_relational_operation (GET_CODE (op0), op0_mode,
 			  			cmp_mode, XEXP (op0, 0),
 						XEXP (op0, 1));

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2017-11-20  8:41 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-28 18:50 [PATCH] Fix bug in simplify_ternary_operation Tom de Vries
2017-08-30  9:12 ` Tom de Vries
2017-08-31 23:37 ` Jeff Law
2017-09-01  8:51   ` Tom de Vries
2017-09-25 16:33     ` [PING][PATCH] " Tom de Vries
2017-11-20  3:12     ` [PATCH] " Jeff Law
2017-11-20  9:48       ` Tom de Vries

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).