On Fri, Jan 12, 2018 at 06:08:55PM +0100, Jakub Jelinek wrote:
> It is true that in my log file I don't have any cases where in C
> it was first TREE_CONSTANT and turned into is_gimple_constant, but that
> doesn't mean it isn't possible.
> 
> Looking at a random testcase, it is
> #0  gimplify_one_sizepos(tree_node**, gimple**) () at 
> ../../gcc/gimplify.c:12572
> #1  0x000000000097f78d in gnat_gimplify_expr(tree_node**, gimple**, gimple**) 
> () at ../../gcc/ada/gcc-interface/trans.c:8465
> #2  0x0000000000ecf638 in gimplify_expr(tree_node**, gimple**, gimple**, bool 
> (*)(tree_node*), int) () at ../../gcc/gimplify.c:11343
> #3  0x0000000000ed4087 in gimplify_stmt (stmt_p=<optimized out>, 
> seq_p=seq_p@entry=0x7fffffffd880) at ../../gcc/gimplify.c:6658
> #4  0x0000000000ed0f9c in gimplify_statement_list (pre_p=0x7fffffffd880, 
> expr_p=0x7fffef8fd380) at ../../gcc/tree-iterator.h:86

Apparently it isn't the only one where we can have a REAL_CST, another one
is gimplify_type_sizes:
  switch (TREE_CODE (type))
    {
    case INTEGER_TYPE:
    case ENUMERAL_TYPE:
    case BOOLEAN_TYPE:
    case REAL_TYPE:
    case FIXED_POINT_TYPE:
      gimplify_one_sizepos (&TYPE_MIN_VALUE (type), list_p);
      gimplify_one_sizepos (&TYPE_MAX_VALUE (type), list_p);

So, what about this patch instead?  No effect at all for any language
during bootstrap/regtest other than C, where it does something for:
     96 64 /home/jakub/src/gcc/gcc/testsuite/c-c++-common/ubsan/bounds-1.c main 
get_initialized_tmp_var
     96 32 /home/jakub/src/gcc/gcc/testsuite/c-c++-common/ubsan/bounds-1.c main 
get_initialized_tmp_var
     48 64 /home/jakub/src/gcc/gcc/testsuite/gcc.c-torture/compile/20000923-1.c 
foo get_initialized_tmp_var
     48 32 /home/jakub/src/gcc/gcc/testsuite/gcc.c-torture/compile/20000923-1.c 
foo get_initialized_tmp_var
     42 64 /home/jakub/src/gcc/gcc/testsuite/c-c++-common/ubsan/vla-2.c main 
get_initialized_tmp_var
     42 32 /home/jakub/src/gcc/gcc/testsuite/c-c++-common/ubsan/vla-2.c main 
get_initialized_tmp_var
     35 64 /home/jakub/src/gcc/gcc/testsuite/c-c++-common/ubsan/pr71512-1.c 
DrawChunk get_initialized_tmp_var
     35 64 
/home/jakub/src/gcc/gcc/testsuite/c-c++-common/asan/swapcontext-test-1.c Run 
get_initialized_tmp_var
     35 64 /home/jakub/src/gcc/gcc/testsuite/c-c++-common/asan/clone-test-1.c 
main get_initialized_tmp_var
     35 32 /home/jakub/src/gcc/gcc/testsuite/c-c++-common/ubsan/pr71512-1.c 
DrawChunk get_initialized_tmp_var
     35 32 
/home/jakub/src/gcc/gcc/testsuite/c-c++-common/asan/swapcontext-test-1.c Run 
get_initialized_tmp_var
     35 32 /home/jakub/src/gcc/gcc/testsuite/c-c++-common/asan/clone-test-1.c 
main get_initialized_tmp_var
     20 64 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/c99-const-expr-12.c f 
get_initialized_tmp_var
     20 32 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/c99-const-expr-12.c f 
get_initialized_tmp_var
     17 64 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/enum-incomplete-3.c foo 
get_initialized_tmp_var
     17 32 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/enum-incomplete-3.c foo 
get_initialized_tmp_var
     10 64 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/combined-directives-1.c
 main get_initialized_tmp_var
     10 64 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/pr25682.c foo 
get_initialized_tmp_var
     10 32 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/combined-directives-1.c
 main get_initialized_tmp_var
     10 32 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/pr25682.c foo 
get_initialized_tmp_var
      8 64 
/home/jakub/src/gcc/gcc/testsuite/gcc.dg/graphite/isl-ast-gen-user-1.c main 
get_initialized_tmp_var
      8 64 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/gomp/pr47963.c foo 
get_initialized_tmp_var
      8 32 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/gomp/pr47963.c foo 
get_initialized_tmp_var
      7 64 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/array-5.c func 
get_initialized_tmp_var
      7 32 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/array-5.c func 
get_initialized_tmp_var
      6 64 ../../../../libgomp/testsuite/libgomp.c/examples-4/target_data-3.c 
main get_initialized_tmp_var
      6 32 ../../../../libgomp/testsuite/libgomp.c/examples-4/target_data-3.c 
main get_initialized_tmp_var
      5 64 /tmp/cgo-gcc-input-804501794.c testSendSIG get_initialized_tmp_var
      5 64 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/zero_length_subarrays.c
 main get_initialized_tmp_var
      5 64 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-4.c
 test_reductions get_initialized_tmp_var
      5 64 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-3.c
 test_reductions_minmax get_initialized_tmp_var
      5 64 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-3.c
 test_reductions get_initialized_tmp_var
      5 64 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-2.c
 test_reductions_minmax get_initialized_tmp_var
      5 64 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-2.c
 test_reductions get_initialized_tmp_var
      5 64 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-1.c
 test_reductions_minmax get_initialized_tmp_var
      5 64 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-1.c
 test_reductions get_initialized_tmp_var
      5 64 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-1.c
 test_reductions_bool get_initialized_tmp_var
      5 64 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/pr70688.c
 main get_initialized_tmp_var
      5 64 issue3250.cgo2.c testSendSIG get_initialized_tmp_var
      5 64 /home/jakub/src/gcc/gcc/testsuite/gcc.target/i386/stack-check-18.c 
f2 get_initialized_tmp_var
      5 64 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/pr50527.c main 
get_initialized_tmp_var
      5 64 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/pr47086.c foo 
get_initialized_tmp_var
      5 64 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/pr44545.c DrawChunk 
get_initialized_tmp_var
      5 64 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/pr43513.c foo3 
get_initialized_tmp_var
      5 64 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/graphite/pr83277.c wv 
get_initialized_tmp_var
      5 64 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/graphite/pr83255.c main 
get_initialized_tmp_var
      5 64 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/c90-const-expr-6.c f 
get_initialized_tmp_var
      5 32 /tmp/cgo-gcc-input-988339533.c testSendSIG get_initialized_tmp_var
      5 32 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/zero_length_subarrays.c
 main get_initialized_tmp_var
      5 32 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-4.c
 test_reductions get_initialized_tmp_var
      5 32 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-3.c
 test_reductions_minmax get_initialized_tmp_var
      5 32 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-3.c
 test_reductions get_initialized_tmp_var
      5 32 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-2.c
 test_reductions_minmax get_initialized_tmp_var
      5 32 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-2.c
 test_reductions get_initialized_tmp_var
      5 32 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-1.c
 test_reductions_minmax get_initialized_tmp_var
      5 32 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-1.c
 test_reductions get_initialized_tmp_var
      5 32 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/reduction-1.c
 test_reductions_bool get_initialized_tmp_var
      5 32 
../../../../libgomp/testsuite/libgomp.oacc-c/../libgomp.oacc-c-c++-common/pr70688.c
 main get_initialized_tmp_var
      5 32 issue3250.cgo2.c testSendSIG get_initialized_tmp_var
      5 32 /home/jakub/src/gcc/gcc/testsuite/gcc.target/i386/stack-check-18.c 
f2 get_initialized_tmp_var
      5 32 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/pr50527.c main 
get_initialized_tmp_var
      5 32 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/pr47086.c foo 
get_initialized_tmp_var
      5 32 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/pr44545.c DrawChunk 
get_initialized_tmp_var
      5 32 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/pr43513.c foo3 
get_initialized_tmp_var
      5 32 /home/jakub/src/gcc/gcc/testsuite/gcc.dg/c90-const-expr-6.c f 
get_initialized_tmp_var
i.e. all cases where we have a const int/size_t etc. bound for a VLA.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2018-01-13  Jakub Jelinek  <ja...@redhat.com>
            Richard Biener  <rgue...@suse.de>

        PR libgomp/83590
        * gimplify.c (gimplify_one_sizepos): Make sure gimplify_one_sizepos
        doesn't turn something previously non-INTEGER_CST into INTEGER_CST.

--- gcc/gimplify.c.jj   2018-01-11 20:34:15.373975356 +0100
+++ gcc/gimplify.c      2018-01-12 13:57:21.153274727 +0100
@@ -12570,6 +12570,15 @@ gimplify_one_sizepos (tree *expr_p, gimp
   /* SSA names in decl/type fields are a bad idea - they'll get reclaimed
      if the def vanishes.  */
   gimplify_expr (expr_p, stmt_p, NULL, is_gimple_val, fb_rvalue, false);
+
+  /* If expr wasn't already is_gimple_sizepos from the FE, ensure that it
+     is a VAR_DECL, otherwise we might handle some decls as gimplify_vla_decl
+     even when they would have all sizes INTEGER_CSTs.  Don't do this if
+     expr is a gimple constant and remains the same kind of constant after
+     gimplification, perhaps with overflows removed, as gimplify_one_sizepos
+     is also used for floating point minimum/maximum.  */
+  if (is_gimple_constant (*expr_p) && TREE_CODE (*expr_p) != TREE_CODE (expr))
+    *expr_p = get_initialized_tmp_var (*expr_p, stmt_p, NULL, false);
 }
 
 /* Gimplify the body of statements of FNDECL and return a GIMPLE_BIND node


        Jakub

Reply via email to