/* PR tree-optimization/92765 - wrong code for strcmp of a union member { dg-do run } { dg-options "-O2 -Wall" } */ #include "strlenopt.h" __attribute__((noipa)) int copy (char *x, int y) { if (y == 0) strcpy (x, "abcd"); return y; } __attribute__((noipa)) char * alloc_2_copy_compare (int x) { char *p; if (x) p = malloc (4); else p = calloc (16, 1); char *q = p + 2; if (copy (q, x)) return p; if (strcmp (q, "abcd") != 0) abort (); return p; } char a5[5], a6[6], a7[7]; __attribute__((noipa)) char * decl_3_copy_compare (int x) { char *p = x < 0 ? a5 : 0 < x ? a6 : a7; char *q = p + 1; if (copy (q, x)) return p; if (strcmp (q, "abcd") != 0) abort (); return p; } int main () { free (alloc_2_copy_compare (0)); free (alloc_2_copy_compare (1)); decl_3_copy_compare (-1); decl_3_copy_compare (0); decl_3_copy_compare (1); }