https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78969
Martin Sebor <msebor at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |diagnostic, | |missed-optimization --- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> --- The same underlying problem (lack of range info) can be seen in the VRP dump for the following test case. The -Walloca-larger-than option is interesting because the alloca pass that implements it tries to compensate for the missing range info by deriving it from conditions the alloca() argument is subjected to (see the alloca_call_type_by_arg function). Although the logic it uses is quite simple in this case it manages to successfully determine the range on its own and avoids the warning. $ cat t.c && gcc -O2 -S -Wall -Walloca-larger-than=255 -fdump-tree-vrp=/dev/stdout t.c void foo (void*); void f (unsigned long j) { if (j / 256) return; foo (__builtin_alloca (j)); } ;; Function f (f, funcdef_no=0, decl_uid=1797, cgraph_uid=0, symbol_order=0) ;; 1 loops found ;; ;; Loop 0 ;; header 0, latch 1 ;; depth 0, outer -1 ;; nodes: 0 1 2 3 4 ;; 2 succs { 4 3 } ;; 3 succs { 4 } ;; 4 succs { 1 } SSA replacement table N_i -> { O_1 ... O_j } means that N_i replaces O_1, ..., O_j j_7 -> { j_3(D) } Incremental SSA update started at block: 2 Number of blocks in CFG: 5 Number of blocks to update: 2 ( 40%) Value ranges after VRP: _1: ~[0B, 0B] .MEM_2: VARYING j_3(D): VARYING j_7: [0, 255] EQUIVALENCES: { j_3(D) } (1 elements) f (long unsigned int j) { void * _1; <bb 2> [100.00%]: if (j_3(D) > 255) goto <bb 4>; [51.01%] else goto <bb 3>; [48.99%] <bb 3> [48.99%]: _1 = __builtin_alloca (j_3(D)); foo (_1); <bb 4> [100.00%]: return; } ;; Function f (f, funcdef_no=0, decl_uid=1797, cgraph_uid=0, symbol_order=0) ;; 1 loops found ;; ;; Loop 0 ;; header 0, latch 1 ;; depth 0, outer -1 ;; nodes: 0 1 2 3 4 ;; 2 succs { 4 3 } ;; 3 succs { 4 } ;; 4 succs { 1 } SSA replacement table N_i -> { O_1 ... O_j } means that N_i replaces O_1, ..., O_j j_7 -> { j_3(D) } Incremental SSA update started at block: 2 Number of blocks in CFG: 5 Number of blocks to update: 2 ( 40%) Value ranges after VRP: _1: ~[0B, 0B] .MEM_2: VARYING j_3(D): VARYING j_7: [0, 255] EQUIVALENCES: { j_3(D) } (1 elements) f (long unsigned int j) { void * _1; <bb 2> [100.00%]: if (j_3(D) > 255) goto <bb 4>; [51.01%] else goto <bb 3>; [48.99%] <bb 3> [48.99%]: _1 = __builtin_alloca (j_3(D)); foo (_1); <bb 4> [100.00%]: return; }