annotate gcc/testsuite/gcc.dg/pr81165.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* { dg-do compile } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 /* { dg-options "-O3 -fdump-tree-optimized" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 /* { dg-final { scan-tree-dump-not " \[/%\] " "optimized" } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 /* Testcase submitted for PR81165, with its main function removed as
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 it's turned into a compile test. We want to make sure that all of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 the divide/remainder computations are removed by tree optimizers.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 We can figure out that we don't need to compute at runtime even the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 condition to enter the loop: the initial i==0 would have to be
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 greater than the sum of two small unsigned values: 1U>>t1 is in the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 range 0..1, whereas the char value is bounded by the range 0..127,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 being 128 % a positive number (zero would invoke undefined
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 behavior, so we can assume it doesn't happen). (We know it's
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 nonnegative because it's 10 times a number that has no more than
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 the bits for 16, 8 and 1 set.)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 We don't realize that the loop is useless right away: jump
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 threading helps remove some of the complexity, particularly of the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 computation within the loop: t1 is compared with 1, but it can
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 never be 1. (We could assume as much, since its being 1 would
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 divide by zero, but we don't.)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 If we don't enter the conditional block, t1 remains at 2; if we do,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 it's set to either -1. If we jump thread at the end of the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 conditional block, we can figure out the ranges exclude 1 and the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 jump body is completely optimized out. However, we used to fail to
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 consider the block for jump threading due to the amount of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 computation in it, without realizing most of it would die in
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 consequence of the threading.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 We now take the dying code into account when deciding whether or
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 not to try jump threading. That might enable us to optimize the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 function into { if (x2 != 0 || (x1 & 1) == 0) abort (); }. At the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 time of this writing, with the patch, we get close, but the test on
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 x2 only gets as far as ((1 >> x2) == 0). Without the patch, some
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 of the loop remains. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 short x0 = 15;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 void func (){
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 volatile int x1 = 1U;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 volatile char x2 = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 char t0 = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 unsigned long t1 = 2LU;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 int i = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 if(1>>x2) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 t0 = -1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 t1 = (1&(short)(x1^8U))-1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 while(i > (int)((1U>>t1)+(char)(128%(10*(25LU&(29%x0)))))) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 i += (int)(12L/(1!=(int)t1));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 if (t0 != -1) __builtin_abort();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 if (t1 != 0L) __builtin_abort();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 }