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