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
Started with r255387.
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; }
DUP. *** This bug has been marked as a duplicate of bug 83298 ***
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