annotate gcc/testsuite/g++.dg/torture/pr41775.C @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* { dg-do compile } */
kono
parents:
diff changeset
2 /* { dg-require-visibility "" } */
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 typedef unsigned int size_t;
kono
parents:
diff changeset
5 namespace std __attribute__ ((__visibility__ ("default")))
kono
parents:
diff changeset
6 {
kono
parents:
diff changeset
7 template < typename _Iterator > struct iterator_traits
kono
parents:
diff changeset
8 {
kono
parents:
diff changeset
9 };
kono
parents:
diff changeset
10 template < typename _Tp > struct iterator_traits <_Tp * >
kono
parents:
diff changeset
11 {
kono
parents:
diff changeset
12 typedef _Tp & reference;
kono
parents:
diff changeset
13 };
kono
parents:
diff changeset
14 }
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
kono
parents:
diff changeset
17 {
kono
parents:
diff changeset
18 using std::iterator_traits;
kono
parents:
diff changeset
19 template < typename _Iterator, typename _Container > class __normal_iterator
kono
parents:
diff changeset
20 {
kono
parents:
diff changeset
21 public:typedef _Iterator iterator_type;
kono
parents:
diff changeset
22 typedef typename iterator_traits < _Iterator >::reference reference;
kono
parents:
diff changeset
23 reference operator* () const
kono
parents:
diff changeset
24 {
kono
parents:
diff changeset
25 }
kono
parents:
diff changeset
26 __normal_iterator operator++ (int)
kono
parents:
diff changeset
27 {
kono
parents:
diff changeset
28 }
kono
parents:
diff changeset
29 };
kono
parents:
diff changeset
30 template < typename _IteratorL, typename _IteratorR,
kono
parents:
diff changeset
31 typename _Container > inline bool operator!= (const __normal_iterator <
kono
parents:
diff changeset
32 _IteratorL,
kono
parents:
diff changeset
33 _Container > &__lhs,
kono
parents:
diff changeset
34 const __normal_iterator <
kono
parents:
diff changeset
35 _IteratorR,
kono
parents:
diff changeset
36 _Container > &__rhs)
kono
parents:
diff changeset
37 {
kono
parents:
diff changeset
38 }
kono
parents:
diff changeset
39 }
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 extern "C"
kono
parents:
diff changeset
42 {
kono
parents:
diff changeset
43 extern "C"
kono
parents:
diff changeset
44 {
kono
parents:
diff changeset
45 __extension__ typedef __SIZE_TYPE__ __intptr_t;
kono
parents:
diff changeset
46 }
kono
parents:
diff changeset
47 }
kono
parents:
diff changeset
48 namespace __gnu_cxx __attribute__ ((__visibility__ ("default")))
kono
parents:
diff changeset
49 {
kono
parents:
diff changeset
50 template < typename _Tp > class new_allocator
kono
parents:
diff changeset
51 {
kono
parents:
diff changeset
52 public:typedef size_t size_type;
kono
parents:
diff changeset
53 typedef _Tp *pointer;
kono
parents:
diff changeset
54 template < typename _Tp1 > struct rebind
kono
parents:
diff changeset
55 {
kono
parents:
diff changeset
56 typedef new_allocator < _Tp1 > other;
kono
parents:
diff changeset
57 };
kono
parents:
diff changeset
58 };
kono
parents:
diff changeset
59 }
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 namespace std __attribute__ ((__visibility__ ("default")))
kono
parents:
diff changeset
62 {
kono
parents:
diff changeset
63 template < typename _Tp > class allocator:public __gnu_cxx::new_allocator <
kono
parents:
diff changeset
64 _Tp >
kono
parents:
diff changeset
65 {
kono
parents:
diff changeset
66 };
kono
parents:
diff changeset
67 }
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 extern "C"
kono
parents:
diff changeset
70 {
kono
parents:
diff changeset
71 typedef __intptr_t intptr_t;
kono
parents:
diff changeset
72 }
kono
parents:
diff changeset
73 namespace llvm
kono
parents:
diff changeset
74 {
kono
parents:
diff changeset
75 template < typename NodeTy > class ilist_half_node
kono
parents:
diff changeset
76 {
kono
parents:
diff changeset
77 };
kono
parents:
diff changeset
78 template < typename NodeTy > class ilist_node:private ilist_half_node <
kono
parents:
diff changeset
79 NodeTy >
kono
parents:
diff changeset
80 {
kono
parents:
diff changeset
81 };
kono
parents:
diff changeset
82 class MachineBasicBlock;
kono
parents:
diff changeset
83 class MachineOperand
kono
parents:
diff changeset
84 {
kono
parents:
diff changeset
85 public:enum MachineOperandType
kono
parents:
diff changeset
86 {
kono
parents:
diff changeset
87 }
kono
parents:
diff changeset
88 Contents;
kono
parents:
diff changeset
89 unsigned getReg () const
kono
parents:
diff changeset
90 {
kono
parents:
diff changeset
91 }
kono
parents:
diff changeset
92 };
kono
parents:
diff changeset
93 class TargetRegisterInfo;
kono
parents:
diff changeset
94 }
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 namespace std __attribute__ ((__visibility__ ("default")))
kono
parents:
diff changeset
97 {
kono
parents:
diff changeset
98 template < typename _Tp, typename _Alloc > struct _Vector_base
kono
parents:
diff changeset
99 {
kono
parents:
diff changeset
100 typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type;
kono
parents:
diff changeset
101 };
kono
parents:
diff changeset
102 template < typename _Tp, typename _Alloc = std::allocator < _Tp > >class vector:protected _Vector_base < _Tp,
kono
parents:
diff changeset
103 _Alloc
kono
parents:
diff changeset
104 >
kono
parents:
diff changeset
105 {
kono
parents:
diff changeset
106 typedef _Vector_base < _Tp, _Alloc > _Base;
kono
parents:
diff changeset
107 typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
kono
parents:
diff changeset
108 public:typedef _Tp value_type;
kono
parents:
diff changeset
109 typedef typename _Tp_alloc_type::pointer pointer;
kono
parents:
diff changeset
110 typedef __gnu_cxx::__normal_iterator < pointer, vector > iterator;
kono
parents:
diff changeset
111 iterator begin ()
kono
parents:
diff changeset
112 {
kono
parents:
diff changeset
113 }
kono
parents:
diff changeset
114 iterator end ()
kono
parents:
diff changeset
115 {
kono
parents:
diff changeset
116 }
kono
parents:
diff changeset
117 };
kono
parents:
diff changeset
118 }
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 namespace llvm
kono
parents:
diff changeset
121 {
kono
parents:
diff changeset
122 class MachineFunction;
kono
parents:
diff changeset
123 class MachineInstr:public ilist_node < MachineInstr >
kono
parents:
diff changeset
124 {
kono
parents:
diff changeset
125 public:const MachineBasicBlock *getParent () const
kono
parents:
diff changeset
126 {
kono
parents:
diff changeset
127 }
kono
parents:
diff changeset
128 const MachineOperand & getOperand (unsigned i) const
kono
parents:
diff changeset
129 {
kono
parents:
diff changeset
130 }
kono
parents:
diff changeset
131 bool registerDefIsDead (unsigned Reg, const TargetRegisterInfo * TRI =
kono
parents:
diff changeset
132 __null) const
kono
parents:
diff changeset
133 {
kono
parents:
diff changeset
134 }
kono
parents:
diff changeset
135 };
kono
parents:
diff changeset
136 class AnalysisResolver;
kono
parents:
diff changeset
137 class Pass
kono
parents:
diff changeset
138 {
kono
parents:
diff changeset
139 AnalysisResolver *Resolver;
kono
parents:
diff changeset
140 intptr_t PassID;
kono
parents:
diff changeset
141 public: explicit Pass (intptr_t pid):Resolver (0), PassID (pid)
kono
parents:
diff changeset
142 {
kono
parents:
diff changeset
143 }
kono
parents:
diff changeset
144 explicit Pass (const void *pid):Resolver (0), PassID ((intptr_t) pid)
kono
parents:
diff changeset
145 {
kono
parents:
diff changeset
146 }
kono
parents:
diff changeset
147 template < typename AnalysisType > AnalysisType & getAnalysis () const;
kono
parents:
diff changeset
148 };
kono
parents:
diff changeset
149 class FunctionPass:public Pass
kono
parents:
diff changeset
150 {
kono
parents:
diff changeset
151 public:explicit FunctionPass (intptr_t pid):Pass (pid)
kono
parents:
diff changeset
152 {
kono
parents:
diff changeset
153 }
kono
parents:
diff changeset
154 explicit FunctionPass (const void *pid):Pass (pid)
kono
parents:
diff changeset
155 {
kono
parents:
diff changeset
156 }
kono
parents:
diff changeset
157 };
kono
parents:
diff changeset
158 class PassInfo
kono
parents:
diff changeset
159 {
kono
parents:
diff changeset
160 public:typedef Pass *(*NormalCtor_t) ();
kono
parents:
diff changeset
161 private:const char *const PassName;
kono
parents:
diff changeset
162 const char *const PassArgument;
kono
parents:
diff changeset
163 const intptr_t PassID;
kono
parents:
diff changeset
164 const bool IsCFGOnlyPass;
kono
parents:
diff changeset
165 const bool IsAnalysis;
kono
parents:
diff changeset
166 const bool IsAnalysisGroup;
kono
parents:
diff changeset
167 NormalCtor_t NormalCtor;
kono
parents:
diff changeset
168 public: PassInfo (const char *name, const char *arg, intptr_t pi, NormalCtor_t normal = 0, bool isCFGOnly = false, bool is_analysis = false):PassName (name), PassArgument (arg), PassID (pi),
kono
parents:
diff changeset
169 IsCFGOnlyPass (isCFGOnly), IsAnalysis (is_analysis),
kono
parents:
diff changeset
170 IsAnalysisGroup (false), NormalCtor (normal)
kono
parents:
diff changeset
171 {
kono
parents:
diff changeset
172 }
kono
parents:
diff changeset
173 };
kono
parents:
diff changeset
174 template < typename PassName > Pass * callDefaultCtor ()
kono
parents:
diff changeset
175 {
kono
parents:
diff changeset
176 return new PassName ();
kono
parents:
diff changeset
177 }
kono
parents:
diff changeset
178 template < typename passName > struct RegisterPass:public PassInfo
kono
parents:
diff changeset
179 {
kono
parents:
diff changeset
180 RegisterPass (const char *PassArg, const char *Name, bool CFGOnly = false, bool is_analysis = false):PassInfo (Name, PassArg, intptr_t (&passName::ID),
kono
parents:
diff changeset
181 PassInfo::NormalCtor_t (callDefaultCtor < passName >), CFGOnly,
kono
parents:
diff changeset
182 is_analysis)
kono
parents:
diff changeset
183 {
kono
parents:
diff changeset
184 }
kono
parents:
diff changeset
185 };
kono
parents:
diff changeset
186 template < typename T > class SmallVectorImpl
kono
parents:
diff changeset
187 {
kono
parents:
diff changeset
188 };
kono
parents:
diff changeset
189 template < typename T,
kono
parents:
diff changeset
190 unsigned N > class SmallVector:public SmallVectorImpl < T >
kono
parents:
diff changeset
191 {
kono
parents:
diff changeset
192 };
kono
parents:
diff changeset
193 class MachineFunctionPass:public FunctionPass
kono
parents:
diff changeset
194 {
kono
parents:
diff changeset
195 protected:explicit MachineFunctionPass (intptr_t ID):FunctionPass (ID)
kono
parents:
diff changeset
196 {
kono
parents:
diff changeset
197 }
kono
parents:
diff changeset
198 explicit MachineFunctionPass (void *ID):FunctionPass (ID)
kono
parents:
diff changeset
199 {
kono
parents:
diff changeset
200 }
kono
parents:
diff changeset
201 virtual bool runOnMachineFunction (MachineFunction & MF) = 0;
kono
parents:
diff changeset
202 };
kono
parents:
diff changeset
203 class LiveIndex
kono
parents:
diff changeset
204 {
kono
parents:
diff changeset
205 private:unsigned index;
kono
parents:
diff changeset
206 };
kono
parents:
diff changeset
207 class VNInfo
kono
parents:
diff changeset
208 {
kono
parents:
diff changeset
209 };
kono
parents:
diff changeset
210 struct LiveRange
kono
parents:
diff changeset
211 {
kono
parents:
diff changeset
212 LiveIndex start;
kono
parents:
diff changeset
213 LiveIndex end;
kono
parents:
diff changeset
214 VNInfo *valno;
kono
parents:
diff changeset
215 };
kono
parents:
diff changeset
216 class LiveInterval
kono
parents:
diff changeset
217 {
kono
parents:
diff changeset
218 public:typedef SmallVector < LiveRange, 4 > Ranges;
kono
parents:
diff changeset
219 bool containsOneValue () const
kono
parents:
diff changeset
220 {
kono
parents:
diff changeset
221 }
kono
parents:
diff changeset
222 LiveRange *getLiveRangeContaining (LiveIndex Idx)
kono
parents:
diff changeset
223 {
kono
parents:
diff changeset
224 }
kono
parents:
diff changeset
225 void removeRange (LiveIndex Start, LiveIndex End, bool RemoveDeadValNo =
kono
parents:
diff changeset
226 false);
kono
parents:
diff changeset
227 void removeRange (LiveRange LR, bool RemoveDeadValNo = false)
kono
parents:
diff changeset
228 {
kono
parents:
diff changeset
229 removeRange (LR.start, LR.end, RemoveDeadValNo);
kono
parents:
diff changeset
230 }
kono
parents:
diff changeset
231 };
kono
parents:
diff changeset
232 class LiveIntervals:public MachineFunctionPass
kono
parents:
diff changeset
233 {
kono
parents:
diff changeset
234 public:static char ID;
kono
parents:
diff changeset
235 LiveIndex getDefIndex (LiveIndex index)
kono
parents:
diff changeset
236 {
kono
parents:
diff changeset
237 }
kono
parents:
diff changeset
238 LiveInterval & getInterval (unsigned reg)
kono
parents:
diff changeset
239 {
kono
parents:
diff changeset
240 }
kono
parents:
diff changeset
241 LiveIndex getInstructionIndex (const MachineInstr * instr) const
kono
parents:
diff changeset
242 {
kono
parents:
diff changeset
243 }
kono
parents:
diff changeset
244 };
kono
parents:
diff changeset
245 }
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 using namespace llvm;
kono
parents:
diff changeset
248 namespace
kono
parents:
diff changeset
249 {
kono
parents:
diff changeset
250 struct __attribute__ ((visibility ("hidden"))) StrongPHIElimination:public
kono
parents:
diff changeset
251 MachineFunctionPass
kono
parents:
diff changeset
252 {
kono
parents:
diff changeset
253 static char ID;
kono
parents:
diff changeset
254 StrongPHIElimination ():MachineFunctionPass (&ID)
kono
parents:
diff changeset
255 {
kono
parents:
diff changeset
256 }
kono
parents:
diff changeset
257 bool runOnMachineFunction (MachineFunction & Fn);
kono
parents:
diff changeset
258 };
kono
parents:
diff changeset
259 }
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 static RegisterPass < StrongPHIElimination > X ("strong-phi-node-elimination",
kono
parents:
diff changeset
262 "Eliminate PHI nodes for register allocation, intelligently");
kono
parents:
diff changeset
263 bool
kono
parents:
diff changeset
264 StrongPHIElimination::runOnMachineFunction (MachineFunction & Fn)
kono
parents:
diff changeset
265 {
kono
parents:
diff changeset
266 LiveIntervals & LI = getAnalysis < LiveIntervals > ();
kono
parents:
diff changeset
267 std::vector < MachineInstr * >phis;
kono
parents:
diff changeset
268 for (std::vector < MachineInstr * >::iterator I = phis.begin (), E =
kono
parents:
diff changeset
269 phis.end (); I != E;)
kono
parents:
diff changeset
270 {
kono
parents:
diff changeset
271 MachineInstr *PInstr = *(I++);
kono
parents:
diff changeset
272 unsigned DestReg = PInstr->getOperand (0).getReg ();
kono
parents:
diff changeset
273 LiveInterval & PI = LI.getInterval (DestReg);
kono
parents:
diff changeset
274 if (PInstr->registerDefIsDead (DestReg))
kono
parents:
diff changeset
275 {
kono
parents:
diff changeset
276 if (PI.containsOneValue ())
kono
parents:
diff changeset
277 {
kono
parents:
diff changeset
278 LiveIndex idx =
kono
parents:
diff changeset
279 LI.getDefIndex (LI.getInstructionIndex (PInstr));
kono
parents:
diff changeset
280 PI.removeRange (*PI.getLiveRangeContaining (idx), true);
kono
parents:
diff changeset
281 }
kono
parents:
diff changeset
282 }
kono
parents:
diff changeset
283 }
kono
parents:
diff changeset
284 }