1/* PR optimization/14235 */
2/* Origin: <senor_fjord@yahoo.com> */
3
4typedef signed char        int8_t;
5typedef short              int16_t;
6typedef int                int32_t;
7typedef unsigned long long uint64_t;
8
9static const uint64_t LOW_BYTE_MASK    = 0x00000000000000ffULL;
10static const uint64_t HIGH_BYTE_MASK   = 0x000000000000ff00ULL;
11static const uint64_t WORD_MASK        = 0x000000000000ffffULL;
12static const uint64_t DWORD_MASK       = 0x00000000ffffffffULL;
13
14extern uint64_t *srca_mask;
15extern int *assert_thrown;
16
17void foo()
18{
19  uint64_t tempA = 0; /* actually a bunch of code to set A */
20  uint64_t tempB = 0; /* actually a bunch of code to set B */
21
22  /* cast A to right size */
23  tempA = (((*srca_mask == LOW_BYTE_MASK) ||
24            (*srca_mask == HIGH_BYTE_MASK)) ?
25           ((int8_t)tempA) :
26           ((*srca_mask == WORD_MASK) ?
27            ((int16_t)tempA) :
28            ((*srca_mask == DWORD_MASK) ?
29             ((int32_t)tempA) :
30             tempA)));
31
32  /* cast B to right size */
33  tempB = (((*srca_mask == LOW_BYTE_MASK) ||
34            (*srca_mask == HIGH_BYTE_MASK)) ?
35           ((int8_t)tempB) :
36           ((*srca_mask == WORD_MASK) ?
37            ((int16_t)tempB) :
38            ((*srca_mask == DWORD_MASK) ?
39             ((int32_t)tempB) :
40             tempB)));
41
42  if ((int) tempA > (int) tempB) {
43    *assert_thrown = 1;
44  }
45}
46