annotate gcc/testsuite/gcc.dg/tree-ssa/vrp14.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do run } */
kono
parents:
diff changeset
2 /* { dg-options "-O2" } */
kono
parents:
diff changeset
3 /* { dg-require-effective-target int32plus } */
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 struct tree_decl
kono
parents:
diff changeset
6 {
kono
parents:
diff changeset
7 union tree_decl_u1 {
kono
parents:
diff changeset
8 int f;
kono
parents:
diff changeset
9 long i;
kono
parents:
diff changeset
10 struct tree_decl_u1_a {
kono
parents:
diff changeset
11 unsigned int align : 24;
kono
parents:
diff changeset
12 unsigned int off_align : 8;
kono
parents:
diff changeset
13 } a;
kono
parents:
diff changeset
14 } u1;
kono
parents:
diff changeset
15 };
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 extern void abort (void);
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 unsigned int
kono
parents:
diff changeset
20 assemble_variable (struct tree_decl decl)
kono
parents:
diff changeset
21 {
kono
parents:
diff changeset
22 unsigned int align;
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 align = decl.u1.a.align;
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 if (align > (1 << ((8 * 4) < 64 ? (8 * 4) - 2 : 62)))
kono
parents:
diff changeset
27 align = (1 << ((8 * 4) < 64 ? (8 * 4) - 2 : 62));
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 /* VRP should not be propagating 0 to the RHS of this assignment.
kono
parents:
diff changeset
30 But it was erroneously applying a cast operation between types of
kono
parents:
diff changeset
31 different precision. align is an unsigned int with range [0,
kono
parents:
diff changeset
32 0x4000000] but the .align field holds only 24 bits. So the cast
kono
parents:
diff changeset
33 was returning a [0, 0] range. */
kono
parents:
diff changeset
34 decl.u1.a.align = align;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 return decl.u1.a.align;
kono
parents:
diff changeset
37 }
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 int
kono
parents:
diff changeset
40 main ()
kono
parents:
diff changeset
41 {
kono
parents:
diff changeset
42 struct tree_decl decl;
kono
parents:
diff changeset
43 decl.u1.a.align = 13;
kono
parents:
diff changeset
44 unsigned int x = assemble_variable (decl);
kono
parents:
diff changeset
45 if (x == 0)
kono
parents:
diff changeset
46 abort ();
kono
parents:
diff changeset
47 return 0;
kono
parents:
diff changeset
48 }