The following avoids a value-number as leader during PRE PHI translation since that exposes us to bogus flow-sensitive info.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Richard. >From d4849ecb2e82e49df4490d92f33c24a851f6e195 Mon Sep 17 00:00:00 2001 From: Richard Guenther <rguent...@suse.de> Date: Thu, 10 Jan 2019 13:34:01 +0100 Subject: [PATCH] fix-pr88792 2019-01-10 Richard Biener <rguent...@suse.de> PR tree-optimization/88792 * tree-ssa-pre.c (get_representative_for): Do not return a value-number here. * gcc.dg/torture/pr88792.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr88792.c b/gcc/testsuite/gcc.dg/torture/pr88792.c new file mode 100644 index 00000000000..e7f8fc0a624 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr88792.c @@ -0,0 +1,32 @@ +/* { dg-do run } */ + +int one = 1; + +char +__attribute__((noipa)) +foo(char v) +{ + int modec; + + if (one) + { + modec = ((v < 'A' || v > 'Z') ? v : v + ('a' - 'A')); + if (modec != 't' && modec != 'c' && modec != 'g') + modec = 0; + } + else + modec = 'g'; + + return modec; +} + +int main(int argc, char **argv) +{ + char c = 't'; + int r = foo (c); + + if (r != c) + __builtin_abort (); + + return 0; +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index a37eff6c7e3..3f38371cb21 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -1262,7 +1262,7 @@ get_representative_for (const pre_expr e, basic_block b = NULL) switch (e->kind) { case NAME: - return VN_INFO (PRE_EXPR_NAME (e))->valnum; + return PRE_EXPR_NAME (e); case CONSTANT: return PRE_EXPR_CONSTANT (e); case NARY: