On Wed, Nov 27, 2013 at 12:31:18AM +0100, Jakub Jelinek wrote: > Please use here: > int z = 2; > if (z & 1) > or similar instead, to make sure it is only early > GIMPLE optimization passes that optimize it away, if already the > front end knows it isn't needed, perhaps in the future it could > just avoid instrumenting it.
Ok. I've put in const int z = 2;, without const the original problem disappeared. Thanks for quick review. 2013-11-27 Marek Polacek <pola...@redhat.com> * ubsan.c (ubsan_type_descriptor): If varpool_get_node returns NULL for a decl, recreate that decl. Save into the hash table VAR_DECLs rather than ADDR_EXPRs. testsuite/ * c-c++-common/ubsan/undefined-1.c: New test. --- gcc/ubsan.c.mp3 2013-11-26 18:07:46.225509763 +0100 +++ gcc/ubsan.c 2013-11-27 00:34:37.617849999 +0100 @@ -269,8 +269,12 @@ ubsan_type_descriptor (tree type, bool w type = TYPE_MAIN_VARIANT (type); tree decl = decl_for_type_lookup (type); - if (decl != NULL_TREE) - return decl; + /* It is possible that some of the earlier created DECLs were found + unused, in that case they weren't emitted and varpool_get_node + returns NULL node on them. But now we really need them. Thus, + renew them here. */ + if (decl != NULL_TREE && varpool_get_node (decl)) + return build_fold_addr_expr (decl); tree dtype = ubsan_type_descriptor_type (); tree type2 = type; @@ -369,11 +373,10 @@ ubsan_type_descriptor (tree type, bool w DECL_INITIAL (decl) = ctor; rest_of_decl_compilation (decl, 1, 0); - /* Save the address of the VAR_DECL into the hash table. */ - decl = build_fold_addr_expr (decl); + /* Save the VAR_DECL into the hash table. */ decl_for_type_insert (type, decl); - return decl; + return build_fold_addr_expr (decl); } /* Create a structure for the ubsan library. NAME is a name of the new --- gcc/testsuite/c-c++-common/ubsan/undefined-1.c.mp3 2013-11-26 23:56:42.151624262 +0100 +++ gcc/testsuite/c-c++-common/ubsan/undefined-1.c 2013-11-27 00:34:21.436784807 +0100 @@ -0,0 +1,26 @@ +/* { dg-do run } */ +/* { dg-options "-fsanitize=undefined" } */ +/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */ + +int +foo (int x, int y) +{ + const int z = 2; + if (z & 1) + return x << y; + return 0; +} + +int +bar (int x, int y) +{ + return x + y; +} + +int +main (void) +{ + foo (3, 2); + bar (12, 42); + return 0; +} Marek