1 // RUN: %clang_cc1 -O2 -emit-llvm %s -o - | not grep alloca
2 // RUN: %clang_cc1 -triple i686-pc-linux-gnu -O2 -emit-llvm %s -o - | not grep store
3 
4 enum {
5  PP_C,
6  PP_D,
7  PP_R,
8  PP_2D,
9  PP_1D,
10  PP_SR,
11  PP_S2D,
12  PP_S1D,
13  PP_SC
14 };
15 
16 enum {
17  G_VP,
18  G_FP,
19  G_VS,
20  G_GS,
21  G_FS
22 };
23 
24 enum {
25  G_NONE,
26  G_B,
27  G_R
28 };
29 
30 typedef union _Key {
31  struct {
32   unsigned int count : 2;
33   unsigned int Aconst : 1;
34   unsigned int Bconst : 1;
35   unsigned int Cconst : 1;
36   unsigned int Xused : 1;
37   unsigned int Yused : 1;
38   unsigned int Zused : 1;
39   unsigned int Wused : 1;
40   unsigned int ttype : 3;
41   unsigned int scalar : 1;
42   unsigned int AType : 4;
43   unsigned int BType : 4;
44   unsigned int CType : 4;
45   unsigned int RType : 4;
46   unsigned int Size : 2;
47   unsigned int prec : 1;
48 
49   unsigned int ASize : 2;
50   unsigned int BSize : 2;
51   unsigned int CSize : 2;
52   unsigned int tTex : 4;
53   unsigned int proj : 1;
54   unsigned int lod : 2;
55   unsigned int dvts : 1;
56   unsigned int uipad : 18;
57  } key_io;
58  struct {
59   unsigned int key0;
60   unsigned int key1;
61  } key;
62  unsigned long long lkey;
63 } Key;
64 
foo(const Key iospec,int * ret)65 static void foo(const Key iospec, int* ret)
66 {
67   *ret=0;
68  if(((iospec.key_io.lod == G_B) &&
69   (iospec.key_io.ttype != G_VS) &&
70   (iospec.key_io.ttype != G_GS) &&
71   (iospec.key_io.ttype != G_FS)) ||
72 
73   (((iospec.key_io.tTex == PP_C) ||
74     (iospec.key_io.tTex == PP_SC)) &&
75    ((iospec.key_io.tTex == PP_SR) ||
76     (iospec.key_io.tTex == PP_S2D) ||
77     (iospec.key_io.tTex == PP_S1D) ||
78     (iospec.key_io.tTex == PP_SC))))
79   *ret=1;
80 }
81 
82 
bar(unsigned long long key_token2)83 extern int bar(unsigned long long key_token2)
84 {
85  int ret;
86  __attribute__ ((unused)) Key iospec = (Key) key_token2;
87  foo(iospec, &ret);
88  return ret;
89 }
90