diff --git a/gcc/gimple.c b/gcc/gimple.c index 41f7cf38b1c..bf863f67ee2 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -2917,8 +2917,8 @@ check_loadstore (gimple *, tree op, tree, void *data) bool infer_nonnull_range (gimple *stmt, tree op) { - return infer_nonnull_range_by_dereference (stmt, op) - || infer_nonnull_range_by_attribute (stmt, op); + return (infer_nonnull_range_by_dereference (stmt, op) + || infer_nonnull_range_by_attribute (stmt, op)); } /* Return true if OP can be inferred to be non-NULL after STMT @@ -2930,7 +2930,8 @@ infer_nonnull_range_by_dereference (gimple *stmt, tree op) non-NULL if -fdelete-null-pointer-checks is enabled. */ if (!flag_delete_null_pointer_checks || !POINTER_TYPE_P (TREE_TYPE (op)) - || gimple_code (stmt) == GIMPLE_ASM) + || gimple_code (stmt) == GIMPLE_ASM + || gimple_clobber_p (stmt)) return false; if (walk_stmt_load_store_ops (stmt, (void *)op, diff --git a/gcc/testsuite/g++.dg/opt/pr96722.C b/gcc/testsuite/g++.dg/opt/pr96722.C new file mode 100644 index 00000000000..408dfeea8a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr96722.C @@ -0,0 +1,20 @@ +// PR tree-optimization/96722 +// { dg-do run } +// { dg-options "-O2" } + +struct S { int s; ~S () {} }; + +void +foo (S *a) +{ + if (a) + return; + a->~S (); +} + +int +main () +{ + S s; + foo (&s); +}