Bug 83383 - [8 Regression] Wrong code with a bunch of type conversion and ternary operators
Summary: [8 Regression] Wrong code with a bunch of type conversion and ternary operators
Status: RESOLVED DUPLICATE of bug 83298
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 8.0
: P3 normal
Target Milestone: 8.0
Assignee: Jeffrey A. Law
URL:
Keywords: wrong-code
Depends on:
Blocks: yarpgen
  Show dependency treegraph
 
Reported: 2017-12-12 02:17 UTC by Dmitry Babokin
Modified: 2021-11-01 23:07 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2017-12-12 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Dmitry Babokin 2017-12-12 02:17:27 UTC
gcc trunk, rev 255537, x86_64.

> cat f.cpp
unsigned long long int tf_3_var_118 = 12702665990007799801ULL;
unsigned char tf_3_var_84 = 195;
unsigned long int tf_3_var_220 = 10859745545766433084UL;
unsigned char tf_3_var_108 = 183;
unsigned long int tf_3_array_1 [2] = {3625445792498952486UL, 1515764644577139006UL};
unsigned long int tf_3_array_4 [2] = {6823003974340523417ul, 8985037393681294663ul};
unsigned long int tf_3_var_132 = 5052410635626804928UL;
void foo() {
  tf_3_var_118 = char(tf_3_var_118) < tf_3_var_84;
  tf_3_var_220 = (tf_3_var_108 ? tf_3_array_1[0] : 0) -
                 (tf_3_array_4[1] * tf_3_var_118 ? 1 : tf_3_var_132);
}

int main() {
    foo();
    __builtin_printf("%lld, %ld\n", tf_3_var_118, tf_3_var_220);
    return 0;
}

> g++ f.cpp -o out -O0; ./out
1, 3625445792498952485
> g++ f.cpp -o out -O2; ./out
1, -142696484312785244
Comment 1 Jakub Jelinek 2017-12-12 11:15:31 UTC
Started with r255387.
Comment 2 Jakub Jelinek 2017-12-12 11:22:21 UTC
Cleaned up testcase for testsuite, in C (so gcc.c-torture/execute/):

/* PR tree-optimization/83383 */

unsigned long long int a = 16ULL;
unsigned char b = 195;
unsigned long long int c = ~0ULL;
unsigned char d = 1;
unsigned long long int e[2] = { 3625445792498952486ULL, 0 };
unsigned long long int f[2] = { 0, 8985037393681294663ULL };
unsigned long long int g = 5052410635626804928ULL;

void
foo ()
{
  a = ((signed char) a) < b;
  c = (d ? e[0] : 0) - (f[1] * a ? 1 : g);
}

int
main()
{
  foo ();
  if (a != 1 || c != 3625445792498952485ULL)
    __builtin_abort ();
  return 0;
}
Comment 3 Jeffrey A. Law 2017-12-12 18:46:57 UTC
DUP.

*** This bug has been marked as a duplicate of bug 83298 ***
Comment 4 Jeffrey A. Law 2017-12-12 22:47:18 UTC
Author: law
Date: Tue Dec 12 22:46:46 2017
New Revision: 255593

URL: https://gcc.gnu.org/viewcvs?rev=255593&root=gcc&view=rev
Log:
	PR tree-optimization/83298
	PR tree-optimization/83362
	PR tree-optimization/83383
	* gimple-ssa-evrp-analyze.h (class evrp_range_analyzer): Make
	push_value_range a public interface.  Add new argument to
	record_ranges_from_stmt.
	* gimple-ssa-evrp-analyze.c
	(evrp_range_analyzer::record_ranges_from_stmt): Add new argument.
	Update comments.  Handle recording temporary equivalences.
	* tree-ssa-dom.c (dom_opt_opt_walker::before_dom_children): Add
	new argument to call to evrp_range_analyzer::record_ranges_from_stmt.
	* gimple-ssa-evrp.c (evrp_dom_walker::before_dom_children): Likewise.
	* tree-ssa-threadedge.c: Include alloc-pool.h, vr-values.h and
	gimple-ssa-evrp-analyze.h.
	(record_temporary_equivalences_from_phis): Add new argument.  When
	the PHI arg is an SSA_NAME, set the result's range to the range
	of the PHI arg.
	(record_temporary_equivalences_from_stmts_at_dest): Record ranges
	from statements too.
	(thread_through_normal_block): Accept new argument, evrp_range_analyzer.
	Pass it down to children as needed.
	(thread_outgoing_edges): Likewise.
	(thread_across_edge): Likewise.   Push/pop range state as needed.
	* tree-ssa-threadedge.h (thread_outgoing_edges): Update prototype.

	PR tree-optimization/83298
	PR tree-optimization/83362
	PR tree-optimization/83383
	* gcc.c-torture/execute/pr83298.c: New test.
	* gcc.c-torture/execute/pr83362.c New test.
	* gcc.c-torture/execute/pr83383.c New test.

Added:
    trunk/gcc/testsuite/gcc.c-torture/execute/pr83298.c
    trunk/gcc/testsuite/gcc.c-torture/execute/pr83362.c
    trunk/gcc/testsuite/gcc.c-torture/execute/pr83383.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/gimple-ssa-evrp-analyze.c
    trunk/gcc/gimple-ssa-evrp-analyze.h
    trunk/gcc/gimple-ssa-evrp.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/tree-ssa-dom.c
    trunk/gcc/tree-ssa-threadedge.c
    trunk/gcc/tree-ssa-threadedge.h
    trunk/gcc/tree-vrp.c