/* PR tree-optimization/91315 - missing strlen lower bound of a string known to be at least N characters { dg-do compile } { dg-options "-O2 -Wall -fdump-tree-optimized" } */ #include "strlenopt.h" #define CAT(x, y) x ## y #define CONCAT(x, y) CAT (x, y) #define FAILNAME(name) CONCAT (call_ ## name ##_on_line_, __LINE__) #define FAIL(name) do { \ extern void FAILNAME (name) (void); \ FAILNAME (name)(); \ } while (0) /* Macro to emit a call to function named call_in_true_branch_not_eliminated_on_line_NNN() for each call that's expected to be eliminated. The dg-final scan-tree-dump-time directive at the bottom of the test verifies that no such call appears in output. */ #define ASSERT_ELIM(expr) \ if (!!(expr)) FAIL (in_true_branch_not_eliminated); else (void)0 char a[32]; void lower_bound_assign_1 (void) { a[0] = '1'; ASSERT_ELIM (strlen (a) < 1); } void lower_bound_assign_2 (void) { a[0] = '1'; a[1] = '2'; ASSERT_ELIM (strlen (a) < 2); } void lower_bound_assign_3 (void) { a[0] = '1'; a[1] = '2'; a[2] = '3'; ASSERT_ELIM (strlen (a) < 3); } void lower_bound_memcpy (void) { memcpy (a, "123", 3); ASSERT_ELIM (strlen (a) < 3); } void lower_bound_memcpy_memcpy_2 (void) { memcpy (a, "123", 3); memcpy (a + 2, "345", 3); ASSERT_ELIM (strlen (a) < 5); } void lower_bound_memcpy_memcpy_3 (void) { memcpy (a, "123", 3); memcpy (a + 3, "456", 3); ASSERT_ELIM (strlen (a) < 6); } /* FIXME: Not optimized yet. void lower_bound_stpcpy_stpcpy_assign (void) { *stpcpy (strcpy (a, "123"), "4567") = '8'; ASSERT_ELIM (strlen (a) < 8); } */ void lower_bound_strcpy_strcat_assign (void) { strcpy (a, "123"); strcat (a, "45"); a[5] = '6'; ASSERT_ELIM (strlen (a) < 6); } /* { dg-final { scan-tree-dump-times "call_in_true_branch_not_eliminated_" 0 "optimized" } } */