annotate gcc/testsuite/g++.dg/torture/pr41775.C @ 158:494b0b89df80 default tip

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