/src/llvm-project/clang/lib/CodeGen/CGExprComplex.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //===--- CGExprComplex.cpp - Emit LLVM Code for Complex Exprs -------------===// |
2 | | // |
3 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | | // See https://llvm.org/LICENSE.txt for license information. |
5 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | // |
9 | | // This contains code to emit Expr nodes with complex types as LLVM code. |
10 | | // |
11 | | //===----------------------------------------------------------------------===// |
12 | | |
13 | | #include "CGOpenMPRuntime.h" |
14 | | #include "CodeGenFunction.h" |
15 | | #include "CodeGenModule.h" |
16 | | #include "ConstantEmitter.h" |
17 | | #include "clang/AST/StmtVisitor.h" |
18 | | #include "llvm/ADT/STLExtras.h" |
19 | | #include "llvm/IR/Constants.h" |
20 | | #include "llvm/IR/Instructions.h" |
21 | | #include "llvm/IR/MDBuilder.h" |
22 | | #include "llvm/IR/Metadata.h" |
23 | | #include <algorithm> |
24 | | using namespace clang; |
25 | | using namespace CodeGen; |
26 | | |
27 | | //===----------------------------------------------------------------------===// |
28 | | // Complex Expression Emitter |
29 | | //===----------------------------------------------------------------------===// |
30 | | |
31 | | typedef CodeGenFunction::ComplexPairTy ComplexPairTy; |
32 | | |
33 | | /// Return the complex type that we are meant to emit. |
34 | 0 | static const ComplexType *getComplexType(QualType type) { |
35 | 0 | type = type.getCanonicalType(); |
36 | 0 | if (const ComplexType *comp = dyn_cast<ComplexType>(type)) { |
37 | 0 | return comp; |
38 | 0 | } else { |
39 | 0 | return cast<ComplexType>(cast<AtomicType>(type)->getValueType()); |
40 | 0 | } |
41 | 0 | } |
42 | | |
43 | | namespace { |
44 | | class ComplexExprEmitter |
45 | | : public StmtVisitor<ComplexExprEmitter, ComplexPairTy> { |
46 | | CodeGenFunction &CGF; |
47 | | CGBuilderTy &Builder; |
48 | | bool IgnoreReal; |
49 | | bool IgnoreImag; |
50 | | public: |
51 | | ComplexExprEmitter(CodeGenFunction &cgf, bool ir=false, bool ii=false) |
52 | 0 | : CGF(cgf), Builder(CGF.Builder), IgnoreReal(ir), IgnoreImag(ii) { |
53 | 0 | } |
54 | | |
55 | | |
56 | | //===--------------------------------------------------------------------===// |
57 | | // Utilities |
58 | | //===--------------------------------------------------------------------===// |
59 | | |
60 | 0 | bool TestAndClearIgnoreReal() { |
61 | 0 | bool I = IgnoreReal; |
62 | 0 | IgnoreReal = false; |
63 | 0 | return I; |
64 | 0 | } |
65 | 0 | bool TestAndClearIgnoreImag() { |
66 | 0 | bool I = IgnoreImag; |
67 | 0 | IgnoreImag = false; |
68 | 0 | return I; |
69 | 0 | } |
70 | | |
71 | | /// EmitLoadOfLValue - Given an expression with complex type that represents a |
72 | | /// value l-value, this method emits the address of the l-value, then loads |
73 | | /// and returns the result. |
74 | 0 | ComplexPairTy EmitLoadOfLValue(const Expr *E) { |
75 | 0 | return EmitLoadOfLValue(CGF.EmitLValue(E), E->getExprLoc()); |
76 | 0 | } |
77 | | |
78 | | ComplexPairTy EmitLoadOfLValue(LValue LV, SourceLocation Loc); |
79 | | |
80 | | /// EmitStoreOfComplex - Store the specified real/imag parts into the |
81 | | /// specified value pointer. |
82 | | void EmitStoreOfComplex(ComplexPairTy Val, LValue LV, bool isInit); |
83 | | |
84 | | /// Emit a cast from complex value Val to DestType. |
85 | | ComplexPairTy EmitComplexToComplexCast(ComplexPairTy Val, QualType SrcType, |
86 | | QualType DestType, SourceLocation Loc); |
87 | | /// Emit a cast from scalar value Val to DestType. |
88 | | ComplexPairTy EmitScalarToComplexCast(llvm::Value *Val, QualType SrcType, |
89 | | QualType DestType, SourceLocation Loc); |
90 | | |
91 | | //===--------------------------------------------------------------------===// |
92 | | // Visitor Methods |
93 | | //===--------------------------------------------------------------------===// |
94 | | |
95 | 0 | ComplexPairTy Visit(Expr *E) { |
96 | 0 | ApplyDebugLocation DL(CGF, E); |
97 | 0 | return StmtVisitor<ComplexExprEmitter, ComplexPairTy>::Visit(E); |
98 | 0 | } |
99 | | |
100 | 0 | ComplexPairTy VisitStmt(Stmt *S) { |
101 | 0 | S->dump(llvm::errs(), CGF.getContext()); |
102 | 0 | llvm_unreachable("Stmt can't have complex result type!"); |
103 | 0 | } |
104 | | ComplexPairTy VisitExpr(Expr *S); |
105 | 0 | ComplexPairTy VisitConstantExpr(ConstantExpr *E) { |
106 | 0 | if (llvm::Constant *Result = ConstantEmitter(CGF).tryEmitConstantExpr(E)) |
107 | 0 | return ComplexPairTy(Result->getAggregateElement(0U), |
108 | 0 | Result->getAggregateElement(1U)); |
109 | 0 | return Visit(E->getSubExpr()); |
110 | 0 | } |
111 | 0 | ComplexPairTy VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr());} |
112 | 0 | ComplexPairTy VisitGenericSelectionExpr(GenericSelectionExpr *GE) { |
113 | 0 | return Visit(GE->getResultExpr()); |
114 | 0 | } |
115 | | ComplexPairTy VisitImaginaryLiteral(const ImaginaryLiteral *IL); |
116 | | ComplexPairTy |
117 | 0 | VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *PE) { |
118 | 0 | return Visit(PE->getReplacement()); |
119 | 0 | } |
120 | 0 | ComplexPairTy VisitCoawaitExpr(CoawaitExpr *S) { |
121 | 0 | return CGF.EmitCoawaitExpr(*S).getComplexVal(); |
122 | 0 | } |
123 | 0 | ComplexPairTy VisitCoyieldExpr(CoyieldExpr *S) { |
124 | 0 | return CGF.EmitCoyieldExpr(*S).getComplexVal(); |
125 | 0 | } |
126 | 0 | ComplexPairTy VisitUnaryCoawait(const UnaryOperator *E) { |
127 | 0 | return Visit(E->getSubExpr()); |
128 | 0 | } |
129 | | |
130 | | ComplexPairTy emitConstant(const CodeGenFunction::ConstantEmission &Constant, |
131 | 0 | Expr *E) { |
132 | 0 | assert(Constant && "not a constant"); |
133 | 0 | if (Constant.isReference()) |
134 | 0 | return EmitLoadOfLValue(Constant.getReferenceLValue(CGF, E), |
135 | 0 | E->getExprLoc()); |
136 | | |
137 | 0 | llvm::Constant *pair = Constant.getValue(); |
138 | 0 | return ComplexPairTy(pair->getAggregateElement(0U), |
139 | 0 | pair->getAggregateElement(1U)); |
140 | 0 | } |
141 | | |
142 | | // l-values. |
143 | 0 | ComplexPairTy VisitDeclRefExpr(DeclRefExpr *E) { |
144 | 0 | if (CodeGenFunction::ConstantEmission Constant = CGF.tryEmitAsConstant(E)) |
145 | 0 | return emitConstant(Constant, E); |
146 | 0 | return EmitLoadOfLValue(E); |
147 | 0 | } |
148 | 0 | ComplexPairTy VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { |
149 | 0 | return EmitLoadOfLValue(E); |
150 | 0 | } |
151 | 0 | ComplexPairTy VisitObjCMessageExpr(ObjCMessageExpr *E) { |
152 | 0 | return CGF.EmitObjCMessageExpr(E).getComplexVal(); |
153 | 0 | } |
154 | 0 | ComplexPairTy VisitArraySubscriptExpr(Expr *E) { return EmitLoadOfLValue(E); } |
155 | 0 | ComplexPairTy VisitMemberExpr(MemberExpr *ME) { |
156 | 0 | if (CodeGenFunction::ConstantEmission Constant = |
157 | 0 | CGF.tryEmitAsConstant(ME)) { |
158 | 0 | CGF.EmitIgnoredExpr(ME->getBase()); |
159 | 0 | return emitConstant(Constant, ME); |
160 | 0 | } |
161 | 0 | return EmitLoadOfLValue(ME); |
162 | 0 | } |
163 | 0 | ComplexPairTy VisitOpaqueValueExpr(OpaqueValueExpr *E) { |
164 | 0 | if (E->isGLValue()) |
165 | 0 | return EmitLoadOfLValue(CGF.getOrCreateOpaqueLValueMapping(E), |
166 | 0 | E->getExprLoc()); |
167 | 0 | return CGF.getOrCreateOpaqueRValueMapping(E).getComplexVal(); |
168 | 0 | } |
169 | | |
170 | 0 | ComplexPairTy VisitPseudoObjectExpr(PseudoObjectExpr *E) { |
171 | 0 | return CGF.EmitPseudoObjectRValue(E).getComplexVal(); |
172 | 0 | } |
173 | | |
174 | | // FIXME: CompoundLiteralExpr |
175 | | |
176 | | ComplexPairTy EmitCast(CastKind CK, Expr *Op, QualType DestTy); |
177 | 0 | ComplexPairTy VisitImplicitCastExpr(ImplicitCastExpr *E) { |
178 | | // Unlike for scalars, we don't have to worry about function->ptr demotion |
179 | | // here. |
180 | 0 | if (E->changesVolatileQualification()) |
181 | 0 | return EmitLoadOfLValue(E); |
182 | 0 | return EmitCast(E->getCastKind(), E->getSubExpr(), E->getType()); |
183 | 0 | } |
184 | 0 | ComplexPairTy VisitCastExpr(CastExpr *E) { |
185 | 0 | if (const auto *ECE = dyn_cast<ExplicitCastExpr>(E)) |
186 | 0 | CGF.CGM.EmitExplicitCastExprType(ECE, &CGF); |
187 | 0 | if (E->changesVolatileQualification()) |
188 | 0 | return EmitLoadOfLValue(E); |
189 | 0 | return EmitCast(E->getCastKind(), E->getSubExpr(), E->getType()); |
190 | 0 | } |
191 | | ComplexPairTy VisitCallExpr(const CallExpr *E); |
192 | | ComplexPairTy VisitStmtExpr(const StmtExpr *E); |
193 | | |
194 | | // Operators. |
195 | | ComplexPairTy VisitPrePostIncDec(const UnaryOperator *E, |
196 | 0 | bool isInc, bool isPre) { |
197 | 0 | LValue LV = CGF.EmitLValue(E->getSubExpr()); |
198 | 0 | return CGF.EmitComplexPrePostIncDec(E, LV, isInc, isPre); |
199 | 0 | } |
200 | 0 | ComplexPairTy VisitUnaryPostDec(const UnaryOperator *E) { |
201 | 0 | return VisitPrePostIncDec(E, false, false); |
202 | 0 | } |
203 | 0 | ComplexPairTy VisitUnaryPostInc(const UnaryOperator *E) { |
204 | 0 | return VisitPrePostIncDec(E, true, false); |
205 | 0 | } |
206 | 0 | ComplexPairTy VisitUnaryPreDec(const UnaryOperator *E) { |
207 | 0 | return VisitPrePostIncDec(E, false, true); |
208 | 0 | } |
209 | 0 | ComplexPairTy VisitUnaryPreInc(const UnaryOperator *E) { |
210 | 0 | return VisitPrePostIncDec(E, true, true); |
211 | 0 | } |
212 | 0 | ComplexPairTy VisitUnaryDeref(const Expr *E) { return EmitLoadOfLValue(E); } |
213 | | |
214 | | ComplexPairTy VisitUnaryPlus(const UnaryOperator *E, |
215 | | QualType PromotionType = QualType()); |
216 | | ComplexPairTy VisitPlus(const UnaryOperator *E, QualType PromotionType); |
217 | | ComplexPairTy VisitUnaryMinus(const UnaryOperator *E, |
218 | | QualType PromotionType = QualType()); |
219 | | ComplexPairTy VisitMinus(const UnaryOperator *E, QualType PromotionType); |
220 | | ComplexPairTy VisitUnaryNot (const UnaryOperator *E); |
221 | | // LNot,Real,Imag never return complex. |
222 | 0 | ComplexPairTy VisitUnaryExtension(const UnaryOperator *E) { |
223 | 0 | return Visit(E->getSubExpr()); |
224 | 0 | } |
225 | 0 | ComplexPairTy VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) { |
226 | 0 | CodeGenFunction::CXXDefaultArgExprScope Scope(CGF, DAE); |
227 | 0 | return Visit(DAE->getExpr()); |
228 | 0 | } |
229 | 0 | ComplexPairTy VisitCXXDefaultInitExpr(CXXDefaultInitExpr *DIE) { |
230 | 0 | CodeGenFunction::CXXDefaultInitExprScope Scope(CGF, DIE); |
231 | 0 | return Visit(DIE->getExpr()); |
232 | 0 | } |
233 | 0 | ComplexPairTy VisitExprWithCleanups(ExprWithCleanups *E) { |
234 | 0 | CodeGenFunction::RunCleanupsScope Scope(CGF); |
235 | 0 | ComplexPairTy Vals = Visit(E->getSubExpr()); |
236 | | // Defend against dominance problems caused by jumps out of expression |
237 | | // evaluation through the shared cleanup block. |
238 | 0 | Scope.ForceCleanup({&Vals.first, &Vals.second}); |
239 | 0 | return Vals; |
240 | 0 | } |
241 | 0 | ComplexPairTy VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { |
242 | 0 | assert(E->getType()->isAnyComplexType() && "Expected complex type!"); |
243 | 0 | QualType Elem = E->getType()->castAs<ComplexType>()->getElementType(); |
244 | 0 | llvm::Constant *Null = llvm::Constant::getNullValue(CGF.ConvertType(Elem)); |
245 | 0 | return ComplexPairTy(Null, Null); |
246 | 0 | } |
247 | 0 | ComplexPairTy VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { |
248 | 0 | assert(E->getType()->isAnyComplexType() && "Expected complex type!"); |
249 | 0 | QualType Elem = E->getType()->castAs<ComplexType>()->getElementType(); |
250 | 0 | llvm::Constant *Null = |
251 | 0 | llvm::Constant::getNullValue(CGF.ConvertType(Elem)); |
252 | 0 | return ComplexPairTy(Null, Null); |
253 | 0 | } |
254 | | |
255 | | struct BinOpInfo { |
256 | | ComplexPairTy LHS; |
257 | | ComplexPairTy RHS; |
258 | | QualType Ty; // Computation Type. |
259 | | FPOptions FPFeatures; |
260 | | }; |
261 | | |
262 | | BinOpInfo EmitBinOps(const BinaryOperator *E, |
263 | | QualType PromotionTy = QualType()); |
264 | | ComplexPairTy EmitPromoted(const Expr *E, QualType PromotionTy); |
265 | | ComplexPairTy EmitPromotedComplexOperand(const Expr *E, QualType PromotionTy); |
266 | | LValue EmitCompoundAssignLValue(const CompoundAssignOperator *E, |
267 | | ComplexPairTy (ComplexExprEmitter::*Func) |
268 | | (const BinOpInfo &), |
269 | | RValue &Val); |
270 | | ComplexPairTy EmitCompoundAssign(const CompoundAssignOperator *E, |
271 | | ComplexPairTy (ComplexExprEmitter::*Func) |
272 | | (const BinOpInfo &)); |
273 | | |
274 | | ComplexPairTy EmitBinAdd(const BinOpInfo &Op); |
275 | | ComplexPairTy EmitBinSub(const BinOpInfo &Op); |
276 | | ComplexPairTy EmitBinMul(const BinOpInfo &Op); |
277 | | ComplexPairTy EmitBinDiv(const BinOpInfo &Op); |
278 | | ComplexPairTy EmitAlgebraicDiv(llvm::Value *A, llvm::Value *B, llvm::Value *C, |
279 | | llvm::Value *D); |
280 | | ComplexPairTy EmitRangeReductionDiv(llvm::Value *A, llvm::Value *B, |
281 | | llvm::Value *C, llvm::Value *D); |
282 | | |
283 | | ComplexPairTy EmitComplexBinOpLibCall(StringRef LibCallName, |
284 | | const BinOpInfo &Op); |
285 | | |
286 | 0 | QualType getPromotionType(QualType Ty) { |
287 | 0 | if (auto *CT = Ty->getAs<ComplexType>()) { |
288 | 0 | QualType ElementType = CT->getElementType(); |
289 | 0 | if (ElementType.UseExcessPrecision(CGF.getContext())) |
290 | 0 | return CGF.getContext().getComplexType(CGF.getContext().FloatTy); |
291 | 0 | } |
292 | 0 | if (Ty.UseExcessPrecision(CGF.getContext())) |
293 | 0 | return CGF.getContext().FloatTy; |
294 | 0 | return QualType(); |
295 | 0 | } |
296 | | |
297 | | #define HANDLEBINOP(OP) \ |
298 | 0 | ComplexPairTy VisitBin##OP(const BinaryOperator *E) { \ |
299 | 0 | QualType promotionTy = getPromotionType(E->getType()); \ |
300 | 0 | ComplexPairTy result = EmitBin##OP(EmitBinOps(E, promotionTy)); \ |
301 | 0 | if (!promotionTy.isNull()) \ |
302 | 0 | result = \ |
303 | 0 | CGF.EmitUnPromotedValue(result, E->getType()); \ |
304 | 0 | return result; \ |
305 | 0 | } Unexecuted instantiation: CGExprComplex.cpp:(anonymous namespace)::ComplexExprEmitter::VisitBinMul(clang::BinaryOperator const*) Unexecuted instantiation: CGExprComplex.cpp:(anonymous namespace)::ComplexExprEmitter::VisitBinDiv(clang::BinaryOperator const*) Unexecuted instantiation: CGExprComplex.cpp:(anonymous namespace)::ComplexExprEmitter::VisitBinAdd(clang::BinaryOperator const*) Unexecuted instantiation: CGExprComplex.cpp:(anonymous namespace)::ComplexExprEmitter::VisitBinSub(clang::BinaryOperator const*) |
306 | | |
307 | | HANDLEBINOP(Mul) |
308 | | HANDLEBINOP(Div) |
309 | | HANDLEBINOP(Add) |
310 | | HANDLEBINOP(Sub) |
311 | | #undef HANDLEBINOP |
312 | | |
313 | 0 | ComplexPairTy VisitCXXRewrittenBinaryOperator(CXXRewrittenBinaryOperator *E) { |
314 | 0 | return Visit(E->getSemanticForm()); |
315 | 0 | } |
316 | | |
317 | | // Compound assignments. |
318 | 0 | ComplexPairTy VisitBinAddAssign(const CompoundAssignOperator *E) { |
319 | 0 | return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinAdd); |
320 | 0 | } |
321 | 0 | ComplexPairTy VisitBinSubAssign(const CompoundAssignOperator *E) { |
322 | 0 | return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinSub); |
323 | 0 | } |
324 | 0 | ComplexPairTy VisitBinMulAssign(const CompoundAssignOperator *E) { |
325 | 0 | return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinMul); |
326 | 0 | } |
327 | 0 | ComplexPairTy VisitBinDivAssign(const CompoundAssignOperator *E) { |
328 | 0 | return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinDiv); |
329 | 0 | } |
330 | | |
331 | | // GCC rejects rem/and/or/xor for integer complex. |
332 | | // Logical and/or always return int, never complex. |
333 | | |
334 | | // No comparisons produce a complex result. |
335 | | |
336 | | LValue EmitBinAssignLValue(const BinaryOperator *E, |
337 | | ComplexPairTy &Val); |
338 | | ComplexPairTy VisitBinAssign (const BinaryOperator *E); |
339 | | ComplexPairTy VisitBinComma (const BinaryOperator *E); |
340 | | |
341 | | |
342 | | ComplexPairTy |
343 | | VisitAbstractConditionalOperator(const AbstractConditionalOperator *CO); |
344 | | ComplexPairTy VisitChooseExpr(ChooseExpr *CE); |
345 | | |
346 | | ComplexPairTy VisitInitListExpr(InitListExpr *E); |
347 | | |
348 | 0 | ComplexPairTy VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { |
349 | 0 | return EmitLoadOfLValue(E); |
350 | 0 | } |
351 | | |
352 | | ComplexPairTy VisitVAArgExpr(VAArgExpr *E); |
353 | | |
354 | 0 | ComplexPairTy VisitAtomicExpr(AtomicExpr *E) { |
355 | 0 | return CGF.EmitAtomicExpr(E).getComplexVal(); |
356 | 0 | } |
357 | | }; |
358 | | } // end anonymous namespace. |
359 | | |
360 | | //===----------------------------------------------------------------------===// |
361 | | // Utilities |
362 | | //===----------------------------------------------------------------------===// |
363 | | |
364 | | Address CodeGenFunction::emitAddrOfRealComponent(Address addr, |
365 | 0 | QualType complexType) { |
366 | 0 | return Builder.CreateStructGEP(addr, 0, addr.getName() + ".realp"); |
367 | 0 | } |
368 | | |
369 | | Address CodeGenFunction::emitAddrOfImagComponent(Address addr, |
370 | 0 | QualType complexType) { |
371 | 0 | return Builder.CreateStructGEP(addr, 1, addr.getName() + ".imagp"); |
372 | 0 | } |
373 | | |
374 | | /// EmitLoadOfLValue - Given an RValue reference for a complex, emit code to |
375 | | /// load the real and imaginary pieces, returning them as Real/Imag. |
376 | | ComplexPairTy ComplexExprEmitter::EmitLoadOfLValue(LValue lvalue, |
377 | 0 | SourceLocation loc) { |
378 | 0 | assert(lvalue.isSimple() && "non-simple complex l-value?"); |
379 | 0 | if (lvalue.getType()->isAtomicType()) |
380 | 0 | return CGF.EmitAtomicLoad(lvalue, loc).getComplexVal(); |
381 | | |
382 | 0 | Address SrcPtr = lvalue.getAddress(CGF); |
383 | 0 | bool isVolatile = lvalue.isVolatileQualified(); |
384 | |
|
385 | 0 | llvm::Value *Real = nullptr, *Imag = nullptr; |
386 | |
|
387 | 0 | if (!IgnoreReal || isVolatile) { |
388 | 0 | Address RealP = CGF.emitAddrOfRealComponent(SrcPtr, lvalue.getType()); |
389 | 0 | Real = Builder.CreateLoad(RealP, isVolatile, SrcPtr.getName() + ".real"); |
390 | 0 | } |
391 | |
|
392 | 0 | if (!IgnoreImag || isVolatile) { |
393 | 0 | Address ImagP = CGF.emitAddrOfImagComponent(SrcPtr, lvalue.getType()); |
394 | 0 | Imag = Builder.CreateLoad(ImagP, isVolatile, SrcPtr.getName() + ".imag"); |
395 | 0 | } |
396 | |
|
397 | 0 | return ComplexPairTy(Real, Imag); |
398 | 0 | } |
399 | | |
400 | | /// EmitStoreOfComplex - Store the specified real/imag parts into the |
401 | | /// specified value pointer. |
402 | | void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, LValue lvalue, |
403 | 0 | bool isInit) { |
404 | 0 | if (lvalue.getType()->isAtomicType() || |
405 | 0 | (!isInit && CGF.LValueIsSuitableForInlineAtomic(lvalue))) |
406 | 0 | return CGF.EmitAtomicStore(RValue::getComplex(Val), lvalue, isInit); |
407 | | |
408 | 0 | Address Ptr = lvalue.getAddress(CGF); |
409 | 0 | Address RealPtr = CGF.emitAddrOfRealComponent(Ptr, lvalue.getType()); |
410 | 0 | Address ImagPtr = CGF.emitAddrOfImagComponent(Ptr, lvalue.getType()); |
411 | |
|
412 | 0 | Builder.CreateStore(Val.first, RealPtr, lvalue.isVolatileQualified()); |
413 | 0 | Builder.CreateStore(Val.second, ImagPtr, lvalue.isVolatileQualified()); |
414 | 0 | } |
415 | | |
416 | | |
417 | | |
418 | | //===----------------------------------------------------------------------===// |
419 | | // Visitor Methods |
420 | | //===----------------------------------------------------------------------===// |
421 | | |
422 | 0 | ComplexPairTy ComplexExprEmitter::VisitExpr(Expr *E) { |
423 | 0 | CGF.ErrorUnsupported(E, "complex expression"); |
424 | 0 | llvm::Type *EltTy = |
425 | 0 | CGF.ConvertType(getComplexType(E->getType())->getElementType()); |
426 | 0 | llvm::Value *U = llvm::UndefValue::get(EltTy); |
427 | 0 | return ComplexPairTy(U, U); |
428 | 0 | } |
429 | | |
430 | | ComplexPairTy ComplexExprEmitter:: |
431 | 0 | VisitImaginaryLiteral(const ImaginaryLiteral *IL) { |
432 | 0 | llvm::Value *Imag = CGF.EmitScalarExpr(IL->getSubExpr()); |
433 | 0 | return ComplexPairTy(llvm::Constant::getNullValue(Imag->getType()), Imag); |
434 | 0 | } |
435 | | |
436 | | |
437 | 0 | ComplexPairTy ComplexExprEmitter::VisitCallExpr(const CallExpr *E) { |
438 | 0 | if (E->getCallReturnType(CGF.getContext())->isReferenceType()) |
439 | 0 | return EmitLoadOfLValue(E); |
440 | | |
441 | 0 | return CGF.EmitCallExpr(E).getComplexVal(); |
442 | 0 | } |
443 | | |
444 | 0 | ComplexPairTy ComplexExprEmitter::VisitStmtExpr(const StmtExpr *E) { |
445 | 0 | CodeGenFunction::StmtExprEvaluation eval(CGF); |
446 | 0 | Address RetAlloca = CGF.EmitCompoundStmt(*E->getSubStmt(), true); |
447 | 0 | assert(RetAlloca.isValid() && "Expected complex return value"); |
448 | 0 | return EmitLoadOfLValue(CGF.MakeAddrLValue(RetAlloca, E->getType()), |
449 | 0 | E->getExprLoc()); |
450 | 0 | } |
451 | | |
452 | | /// Emit a cast from complex value Val to DestType. |
453 | | ComplexPairTy ComplexExprEmitter::EmitComplexToComplexCast(ComplexPairTy Val, |
454 | | QualType SrcType, |
455 | | QualType DestType, |
456 | 0 | SourceLocation Loc) { |
457 | | // Get the src/dest element type. |
458 | 0 | SrcType = SrcType->castAs<ComplexType>()->getElementType(); |
459 | 0 | DestType = DestType->castAs<ComplexType>()->getElementType(); |
460 | | |
461 | | // C99 6.3.1.6: When a value of complex type is converted to another |
462 | | // complex type, both the real and imaginary parts follow the conversion |
463 | | // rules for the corresponding real types. |
464 | 0 | if (Val.first) |
465 | 0 | Val.first = CGF.EmitScalarConversion(Val.first, SrcType, DestType, Loc); |
466 | 0 | if (Val.second) |
467 | 0 | Val.second = CGF.EmitScalarConversion(Val.second, SrcType, DestType, Loc); |
468 | 0 | return Val; |
469 | 0 | } |
470 | | |
471 | | ComplexPairTy ComplexExprEmitter::EmitScalarToComplexCast(llvm::Value *Val, |
472 | | QualType SrcType, |
473 | | QualType DestType, |
474 | 0 | SourceLocation Loc) { |
475 | | // Convert the input element to the element type of the complex. |
476 | 0 | DestType = DestType->castAs<ComplexType>()->getElementType(); |
477 | 0 | Val = CGF.EmitScalarConversion(Val, SrcType, DestType, Loc); |
478 | | |
479 | | // Return (realval, 0). |
480 | 0 | return ComplexPairTy(Val, llvm::Constant::getNullValue(Val->getType())); |
481 | 0 | } |
482 | | |
483 | | ComplexPairTy ComplexExprEmitter::EmitCast(CastKind CK, Expr *Op, |
484 | 0 | QualType DestTy) { |
485 | 0 | switch (CK) { |
486 | 0 | case CK_Dependent: llvm_unreachable("dependent cast kind in IR gen!"); |
487 | | |
488 | | // Atomic to non-atomic casts may be more than a no-op for some platforms and |
489 | | // for some types. |
490 | 0 | case CK_AtomicToNonAtomic: |
491 | 0 | case CK_NonAtomicToAtomic: |
492 | 0 | case CK_NoOp: |
493 | 0 | case CK_LValueToRValue: |
494 | 0 | case CK_UserDefinedConversion: |
495 | 0 | return Visit(Op); |
496 | | |
497 | 0 | case CK_LValueBitCast: { |
498 | 0 | LValue origLV = CGF.EmitLValue(Op); |
499 | 0 | Address V = origLV.getAddress(CGF).withElementType(CGF.ConvertType(DestTy)); |
500 | 0 | return EmitLoadOfLValue(CGF.MakeAddrLValue(V, DestTy), Op->getExprLoc()); |
501 | 0 | } |
502 | | |
503 | 0 | case CK_LValueToRValueBitCast: { |
504 | 0 | LValue SourceLVal = CGF.EmitLValue(Op); |
505 | 0 | Address Addr = SourceLVal.getAddress(CGF).withElementType( |
506 | 0 | CGF.ConvertTypeForMem(DestTy)); |
507 | 0 | LValue DestLV = CGF.MakeAddrLValue(Addr, DestTy); |
508 | 0 | DestLV.setTBAAInfo(TBAAAccessInfo::getMayAliasInfo()); |
509 | 0 | return EmitLoadOfLValue(DestLV, Op->getExprLoc()); |
510 | 0 | } |
511 | | |
512 | 0 | case CK_BitCast: |
513 | 0 | case CK_BaseToDerived: |
514 | 0 | case CK_DerivedToBase: |
515 | 0 | case CK_UncheckedDerivedToBase: |
516 | 0 | case CK_Dynamic: |
517 | 0 | case CK_ToUnion: |
518 | 0 | case CK_ArrayToPointerDecay: |
519 | 0 | case CK_FunctionToPointerDecay: |
520 | 0 | case CK_NullToPointer: |
521 | 0 | case CK_NullToMemberPointer: |
522 | 0 | case CK_BaseToDerivedMemberPointer: |
523 | 0 | case CK_DerivedToBaseMemberPointer: |
524 | 0 | case CK_MemberPointerToBoolean: |
525 | 0 | case CK_ReinterpretMemberPointer: |
526 | 0 | case CK_ConstructorConversion: |
527 | 0 | case CK_IntegralToPointer: |
528 | 0 | case CK_PointerToIntegral: |
529 | 0 | case CK_PointerToBoolean: |
530 | 0 | case CK_ToVoid: |
531 | 0 | case CK_VectorSplat: |
532 | 0 | case CK_IntegralCast: |
533 | 0 | case CK_BooleanToSignedIntegral: |
534 | 0 | case CK_IntegralToBoolean: |
535 | 0 | case CK_IntegralToFloating: |
536 | 0 | case CK_FloatingToIntegral: |
537 | 0 | case CK_FloatingToBoolean: |
538 | 0 | case CK_FloatingCast: |
539 | 0 | case CK_CPointerToObjCPointerCast: |
540 | 0 | case CK_BlockPointerToObjCPointerCast: |
541 | 0 | case CK_AnyPointerToBlockPointerCast: |
542 | 0 | case CK_ObjCObjectLValueCast: |
543 | 0 | case CK_FloatingComplexToReal: |
544 | 0 | case CK_FloatingComplexToBoolean: |
545 | 0 | case CK_IntegralComplexToReal: |
546 | 0 | case CK_IntegralComplexToBoolean: |
547 | 0 | case CK_ARCProduceObject: |
548 | 0 | case CK_ARCConsumeObject: |
549 | 0 | case CK_ARCReclaimReturnedObject: |
550 | 0 | case CK_ARCExtendBlockObject: |
551 | 0 | case CK_CopyAndAutoreleaseBlockObject: |
552 | 0 | case CK_BuiltinFnToFnPtr: |
553 | 0 | case CK_ZeroToOCLOpaqueType: |
554 | 0 | case CK_AddressSpaceConversion: |
555 | 0 | case CK_IntToOCLSampler: |
556 | 0 | case CK_FloatingToFixedPoint: |
557 | 0 | case CK_FixedPointToFloating: |
558 | 0 | case CK_FixedPointCast: |
559 | 0 | case CK_FixedPointToBoolean: |
560 | 0 | case CK_FixedPointToIntegral: |
561 | 0 | case CK_IntegralToFixedPoint: |
562 | 0 | case CK_MatrixCast: |
563 | 0 | llvm_unreachable("invalid cast kind for complex value"); |
564 | |
|
565 | 0 | case CK_FloatingRealToComplex: |
566 | 0 | case CK_IntegralRealToComplex: { |
567 | 0 | CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Op); |
568 | 0 | return EmitScalarToComplexCast(CGF.EmitScalarExpr(Op), Op->getType(), |
569 | 0 | DestTy, Op->getExprLoc()); |
570 | 0 | } |
571 | | |
572 | 0 | case CK_FloatingComplexCast: |
573 | 0 | case CK_FloatingComplexToIntegralComplex: |
574 | 0 | case CK_IntegralComplexCast: |
575 | 0 | case CK_IntegralComplexToFloatingComplex: { |
576 | 0 | CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Op); |
577 | 0 | return EmitComplexToComplexCast(Visit(Op), Op->getType(), DestTy, |
578 | 0 | Op->getExprLoc()); |
579 | 0 | } |
580 | 0 | } |
581 | | |
582 | 0 | llvm_unreachable("unknown cast resulting in complex value"); |
583 | 0 | } |
584 | | |
585 | | ComplexPairTy ComplexExprEmitter::VisitUnaryPlus(const UnaryOperator *E, |
586 | 0 | QualType PromotionType) { |
587 | 0 | QualType promotionTy = PromotionType.isNull() |
588 | 0 | ? getPromotionType(E->getSubExpr()->getType()) |
589 | 0 | : PromotionType; |
590 | 0 | ComplexPairTy result = VisitPlus(E, promotionTy); |
591 | 0 | if (!promotionTy.isNull()) |
592 | 0 | return CGF.EmitUnPromotedValue(result, E->getSubExpr()->getType()); |
593 | 0 | return result; |
594 | 0 | } |
595 | | |
596 | | ComplexPairTy ComplexExprEmitter::VisitPlus(const UnaryOperator *E, |
597 | 0 | QualType PromotionType) { |
598 | 0 | TestAndClearIgnoreReal(); |
599 | 0 | TestAndClearIgnoreImag(); |
600 | 0 | if (!PromotionType.isNull()) |
601 | 0 | return CGF.EmitPromotedComplexExpr(E->getSubExpr(), PromotionType); |
602 | 0 | return Visit(E->getSubExpr()); |
603 | 0 | } |
604 | | |
605 | | ComplexPairTy ComplexExprEmitter::VisitUnaryMinus(const UnaryOperator *E, |
606 | 0 | QualType PromotionType) { |
607 | 0 | QualType promotionTy = PromotionType.isNull() |
608 | 0 | ? getPromotionType(E->getSubExpr()->getType()) |
609 | 0 | : PromotionType; |
610 | 0 | ComplexPairTy result = VisitMinus(E, promotionTy); |
611 | 0 | if (!promotionTy.isNull()) |
612 | 0 | return CGF.EmitUnPromotedValue(result, E->getSubExpr()->getType()); |
613 | 0 | return result; |
614 | 0 | } |
615 | | ComplexPairTy ComplexExprEmitter::VisitMinus(const UnaryOperator *E, |
616 | 0 | QualType PromotionType) { |
617 | 0 | TestAndClearIgnoreReal(); |
618 | 0 | TestAndClearIgnoreImag(); |
619 | 0 | ComplexPairTy Op; |
620 | 0 | if (!PromotionType.isNull()) |
621 | 0 | Op = CGF.EmitPromotedComplexExpr(E->getSubExpr(), PromotionType); |
622 | 0 | else |
623 | 0 | Op = Visit(E->getSubExpr()); |
624 | |
|
625 | 0 | llvm::Value *ResR, *ResI; |
626 | 0 | if (Op.first->getType()->isFloatingPointTy()) { |
627 | 0 | ResR = Builder.CreateFNeg(Op.first, "neg.r"); |
628 | 0 | ResI = Builder.CreateFNeg(Op.second, "neg.i"); |
629 | 0 | } else { |
630 | 0 | ResR = Builder.CreateNeg(Op.first, "neg.r"); |
631 | 0 | ResI = Builder.CreateNeg(Op.second, "neg.i"); |
632 | 0 | } |
633 | 0 | return ComplexPairTy(ResR, ResI); |
634 | 0 | } |
635 | | |
636 | 0 | ComplexPairTy ComplexExprEmitter::VisitUnaryNot(const UnaryOperator *E) { |
637 | 0 | TestAndClearIgnoreReal(); |
638 | 0 | TestAndClearIgnoreImag(); |
639 | | // ~(a+ib) = a + i*-b |
640 | 0 | ComplexPairTy Op = Visit(E->getSubExpr()); |
641 | 0 | llvm::Value *ResI; |
642 | 0 | if (Op.second->getType()->isFloatingPointTy()) |
643 | 0 | ResI = Builder.CreateFNeg(Op.second, "conj.i"); |
644 | 0 | else |
645 | 0 | ResI = Builder.CreateNeg(Op.second, "conj.i"); |
646 | |
|
647 | 0 | return ComplexPairTy(Op.first, ResI); |
648 | 0 | } |
649 | | |
650 | 0 | ComplexPairTy ComplexExprEmitter::EmitBinAdd(const BinOpInfo &Op) { |
651 | 0 | llvm::Value *ResR, *ResI; |
652 | |
|
653 | 0 | if (Op.LHS.first->getType()->isFloatingPointTy()) { |
654 | 0 | CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Op.FPFeatures); |
655 | 0 | ResR = Builder.CreateFAdd(Op.LHS.first, Op.RHS.first, "add.r"); |
656 | 0 | if (Op.LHS.second && Op.RHS.second) |
657 | 0 | ResI = Builder.CreateFAdd(Op.LHS.second, Op.RHS.second, "add.i"); |
658 | 0 | else |
659 | 0 | ResI = Op.LHS.second ? Op.LHS.second : Op.RHS.second; |
660 | 0 | assert(ResI && "Only one operand may be real!"); |
661 | 0 | } else { |
662 | 0 | ResR = Builder.CreateAdd(Op.LHS.first, Op.RHS.first, "add.r"); |
663 | 0 | assert(Op.LHS.second && Op.RHS.second && |
664 | 0 | "Both operands of integer complex operators must be complex!"); |
665 | 0 | ResI = Builder.CreateAdd(Op.LHS.second, Op.RHS.second, "add.i"); |
666 | 0 | } |
667 | 0 | return ComplexPairTy(ResR, ResI); |
668 | 0 | } |
669 | | |
670 | 0 | ComplexPairTy ComplexExprEmitter::EmitBinSub(const BinOpInfo &Op) { |
671 | 0 | llvm::Value *ResR, *ResI; |
672 | 0 | if (Op.LHS.first->getType()->isFloatingPointTy()) { |
673 | 0 | CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Op.FPFeatures); |
674 | 0 | ResR = Builder.CreateFSub(Op.LHS.first, Op.RHS.first, "sub.r"); |
675 | 0 | if (Op.LHS.second && Op.RHS.second) |
676 | 0 | ResI = Builder.CreateFSub(Op.LHS.second, Op.RHS.second, "sub.i"); |
677 | 0 | else |
678 | 0 | ResI = Op.LHS.second ? Op.LHS.second |
679 | 0 | : Builder.CreateFNeg(Op.RHS.second, "sub.i"); |
680 | 0 | assert(ResI && "Only one operand may be real!"); |
681 | 0 | } else { |
682 | 0 | ResR = Builder.CreateSub(Op.LHS.first, Op.RHS.first, "sub.r"); |
683 | 0 | assert(Op.LHS.second && Op.RHS.second && |
684 | 0 | "Both operands of integer complex operators must be complex!"); |
685 | 0 | ResI = Builder.CreateSub(Op.LHS.second, Op.RHS.second, "sub.i"); |
686 | 0 | } |
687 | 0 | return ComplexPairTy(ResR, ResI); |
688 | 0 | } |
689 | | |
690 | | /// Emit a libcall for a binary operation on complex types. |
691 | | ComplexPairTy ComplexExprEmitter::EmitComplexBinOpLibCall(StringRef LibCallName, |
692 | 0 | const BinOpInfo &Op) { |
693 | 0 | CallArgList Args; |
694 | 0 | Args.add(RValue::get(Op.LHS.first), |
695 | 0 | Op.Ty->castAs<ComplexType>()->getElementType()); |
696 | 0 | Args.add(RValue::get(Op.LHS.second), |
697 | 0 | Op.Ty->castAs<ComplexType>()->getElementType()); |
698 | 0 | Args.add(RValue::get(Op.RHS.first), |
699 | 0 | Op.Ty->castAs<ComplexType>()->getElementType()); |
700 | 0 | Args.add(RValue::get(Op.RHS.second), |
701 | 0 | Op.Ty->castAs<ComplexType>()->getElementType()); |
702 | | |
703 | | // We *must* use the full CG function call building logic here because the |
704 | | // complex type has special ABI handling. We also should not forget about |
705 | | // special calling convention which may be used for compiler builtins. |
706 | | |
707 | | // We create a function qualified type to state that this call does not have |
708 | | // any exceptions. |
709 | 0 | FunctionProtoType::ExtProtoInfo EPI; |
710 | 0 | EPI = EPI.withExceptionSpec( |
711 | 0 | FunctionProtoType::ExceptionSpecInfo(EST_BasicNoexcept)); |
712 | 0 | SmallVector<QualType, 4> ArgsQTys( |
713 | 0 | 4, Op.Ty->castAs<ComplexType>()->getElementType()); |
714 | 0 | QualType FQTy = CGF.getContext().getFunctionType(Op.Ty, ArgsQTys, EPI); |
715 | 0 | const CGFunctionInfo &FuncInfo = CGF.CGM.getTypes().arrangeFreeFunctionCall( |
716 | 0 | Args, cast<FunctionType>(FQTy.getTypePtr()), false); |
717 | |
|
718 | 0 | llvm::FunctionType *FTy = CGF.CGM.getTypes().GetFunctionType(FuncInfo); |
719 | 0 | llvm::FunctionCallee Func = CGF.CGM.CreateRuntimeFunction( |
720 | 0 | FTy, LibCallName, llvm::AttributeList(), true); |
721 | 0 | CGCallee Callee = CGCallee::forDirect(Func, FQTy->getAs<FunctionProtoType>()); |
722 | |
|
723 | 0 | llvm::CallBase *Call; |
724 | 0 | RValue Res = CGF.EmitCall(FuncInfo, Callee, ReturnValueSlot(), Args, &Call); |
725 | 0 | Call->setCallingConv(CGF.CGM.getRuntimeCC()); |
726 | 0 | return Res.getComplexVal(); |
727 | 0 | } |
728 | | |
729 | | /// Lookup the libcall name for a given floating point type complex |
730 | | /// multiply. |
731 | 0 | static StringRef getComplexMultiplyLibCallName(llvm::Type *Ty) { |
732 | 0 | switch (Ty->getTypeID()) { |
733 | 0 | default: |
734 | 0 | llvm_unreachable("Unsupported floating point type!"); |
735 | 0 | case llvm::Type::HalfTyID: |
736 | 0 | return "__mulhc3"; |
737 | 0 | case llvm::Type::FloatTyID: |
738 | 0 | return "__mulsc3"; |
739 | 0 | case llvm::Type::DoubleTyID: |
740 | 0 | return "__muldc3"; |
741 | 0 | case llvm::Type::PPC_FP128TyID: |
742 | 0 | return "__multc3"; |
743 | 0 | case llvm::Type::X86_FP80TyID: |
744 | 0 | return "__mulxc3"; |
745 | 0 | case llvm::Type::FP128TyID: |
746 | 0 | return "__multc3"; |
747 | 0 | } |
748 | 0 | } |
749 | | |
750 | | // See C11 Annex G.5.1 for the semantics of multiplicative operators on complex |
751 | | // typed values. |
752 | 0 | ComplexPairTy ComplexExprEmitter::EmitBinMul(const BinOpInfo &Op) { |
753 | 0 | using llvm::Value; |
754 | 0 | Value *ResR, *ResI; |
755 | 0 | llvm::MDBuilder MDHelper(CGF.getLLVMContext()); |
756 | |
|
757 | 0 | if (Op.LHS.first->getType()->isFloatingPointTy()) { |
758 | | // The general formulation is: |
759 | | // (a + ib) * (c + id) = (a * c - b * d) + i(a * d + b * c) |
760 | | // |
761 | | // But we can fold away components which would be zero due to a real |
762 | | // operand according to C11 Annex G.5.1p2. |
763 | | // FIXME: C11 also provides for imaginary types which would allow folding |
764 | | // still more of this within the type system. |
765 | |
|
766 | 0 | CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Op.FPFeatures); |
767 | 0 | if (Op.LHS.second && Op.RHS.second) { |
768 | | // If both operands are complex, emit the core math directly, and then |
769 | | // test for NaNs. If we find NaNs in the result, we delegate to a libcall |
770 | | // to carefully re-compute the correct infinity representation if |
771 | | // possible. The expectation is that the presence of NaNs here is |
772 | | // *extremely* rare, and so the cost of the libcall is almost irrelevant. |
773 | | // This is good, because the libcall re-computes the core multiplication |
774 | | // exactly the same as we do here and re-tests for NaNs in order to be |
775 | | // a generic complex*complex libcall. |
776 | | |
777 | | // First compute the four products. |
778 | 0 | Value *AC = Builder.CreateFMul(Op.LHS.first, Op.RHS.first, "mul_ac"); |
779 | 0 | Value *BD = Builder.CreateFMul(Op.LHS.second, Op.RHS.second, "mul_bd"); |
780 | 0 | Value *AD = Builder.CreateFMul(Op.LHS.first, Op.RHS.second, "mul_ad"); |
781 | 0 | Value *BC = Builder.CreateFMul(Op.LHS.second, Op.RHS.first, "mul_bc"); |
782 | | |
783 | | // The real part is the difference of the first two, the imaginary part is |
784 | | // the sum of the second. |
785 | 0 | ResR = Builder.CreateFSub(AC, BD, "mul_r"); |
786 | 0 | ResI = Builder.CreateFAdd(AD, BC, "mul_i"); |
787 | |
|
788 | 0 | if (Op.FPFeatures.getComplexRange() == LangOptions::CX_Limited || |
789 | 0 | Op.FPFeatures.getComplexRange() == LangOptions::CX_Fortran) |
790 | 0 | return ComplexPairTy(ResR, ResI); |
791 | | |
792 | | // Emit the test for the real part becoming NaN and create a branch to |
793 | | // handle it. We test for NaN by comparing the number to itself. |
794 | 0 | Value *IsRNaN = Builder.CreateFCmpUNO(ResR, ResR, "isnan_cmp"); |
795 | 0 | llvm::BasicBlock *ContBB = CGF.createBasicBlock("complex_mul_cont"); |
796 | 0 | llvm::BasicBlock *INaNBB = CGF.createBasicBlock("complex_mul_imag_nan"); |
797 | 0 | llvm::Instruction *Branch = Builder.CreateCondBr(IsRNaN, INaNBB, ContBB); |
798 | 0 | llvm::BasicBlock *OrigBB = Branch->getParent(); |
799 | | |
800 | | // Give hint that we very much don't expect to see NaNs. |
801 | | // Value chosen to match UR_NONTAKEN_WEIGHT, see BranchProbabilityInfo.cpp |
802 | 0 | llvm::MDNode *BrWeight = MDHelper.createBranchWeights(1, (1U << 20) - 1); |
803 | 0 | Branch->setMetadata(llvm::LLVMContext::MD_prof, BrWeight); |
804 | | |
805 | | // Now test the imaginary part and create its branch. |
806 | 0 | CGF.EmitBlock(INaNBB); |
807 | 0 | Value *IsINaN = Builder.CreateFCmpUNO(ResI, ResI, "isnan_cmp"); |
808 | 0 | llvm::BasicBlock *LibCallBB = CGF.createBasicBlock("complex_mul_libcall"); |
809 | 0 | Branch = Builder.CreateCondBr(IsINaN, LibCallBB, ContBB); |
810 | 0 | Branch->setMetadata(llvm::LLVMContext::MD_prof, BrWeight); |
811 | | |
812 | | // Now emit the libcall on this slowest of the slow paths. |
813 | 0 | CGF.EmitBlock(LibCallBB); |
814 | 0 | Value *LibCallR, *LibCallI; |
815 | 0 | std::tie(LibCallR, LibCallI) = EmitComplexBinOpLibCall( |
816 | 0 | getComplexMultiplyLibCallName(Op.LHS.first->getType()), Op); |
817 | 0 | Builder.CreateBr(ContBB); |
818 | | |
819 | | // Finally continue execution by phi-ing together the different |
820 | | // computation paths. |
821 | 0 | CGF.EmitBlock(ContBB); |
822 | 0 | llvm::PHINode *RealPHI = Builder.CreatePHI(ResR->getType(), 3, "real_mul_phi"); |
823 | 0 | RealPHI->addIncoming(ResR, OrigBB); |
824 | 0 | RealPHI->addIncoming(ResR, INaNBB); |
825 | 0 | RealPHI->addIncoming(LibCallR, LibCallBB); |
826 | 0 | llvm::PHINode *ImagPHI = Builder.CreatePHI(ResI->getType(), 3, "imag_mul_phi"); |
827 | 0 | ImagPHI->addIncoming(ResI, OrigBB); |
828 | 0 | ImagPHI->addIncoming(ResI, INaNBB); |
829 | 0 | ImagPHI->addIncoming(LibCallI, LibCallBB); |
830 | 0 | return ComplexPairTy(RealPHI, ImagPHI); |
831 | 0 | } |
832 | 0 | assert((Op.LHS.second || Op.RHS.second) && |
833 | 0 | "At least one operand must be complex!"); |
834 | | |
835 | | // If either of the operands is a real rather than a complex, the |
836 | | // imaginary component is ignored when computing the real component of the |
837 | | // result. |
838 | 0 | ResR = Builder.CreateFMul(Op.LHS.first, Op.RHS.first, "mul.rl"); |
839 | |
|
840 | 0 | ResI = Op.LHS.second |
841 | 0 | ? Builder.CreateFMul(Op.LHS.second, Op.RHS.first, "mul.il") |
842 | 0 | : Builder.CreateFMul(Op.LHS.first, Op.RHS.second, "mul.ir"); |
843 | 0 | } else { |
844 | 0 | assert(Op.LHS.second && Op.RHS.second && |
845 | 0 | "Both operands of integer complex operators must be complex!"); |
846 | 0 | Value *ResRl = Builder.CreateMul(Op.LHS.first, Op.RHS.first, "mul.rl"); |
847 | 0 | Value *ResRr = Builder.CreateMul(Op.LHS.second, Op.RHS.second, "mul.rr"); |
848 | 0 | ResR = Builder.CreateSub(ResRl, ResRr, "mul.r"); |
849 | |
|
850 | 0 | Value *ResIl = Builder.CreateMul(Op.LHS.second, Op.RHS.first, "mul.il"); |
851 | 0 | Value *ResIr = Builder.CreateMul(Op.LHS.first, Op.RHS.second, "mul.ir"); |
852 | 0 | ResI = Builder.CreateAdd(ResIl, ResIr, "mul.i"); |
853 | 0 | } |
854 | 0 | return ComplexPairTy(ResR, ResI); |
855 | 0 | } |
856 | | |
857 | | ComplexPairTy ComplexExprEmitter::EmitAlgebraicDiv(llvm::Value *LHSr, |
858 | | llvm::Value *LHSi, |
859 | | llvm::Value *RHSr, |
860 | 0 | llvm::Value *RHSi) { |
861 | | // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd)) |
862 | 0 | llvm::Value *DSTr, *DSTi; |
863 | |
|
864 | 0 | llvm::Value *AC = Builder.CreateFMul(LHSr, RHSr); // a*c |
865 | 0 | llvm::Value *BD = Builder.CreateFMul(LHSi, RHSi); // b*d |
866 | 0 | llvm::Value *ACpBD = Builder.CreateFAdd(AC, BD); // ac+bd |
867 | |
|
868 | 0 | llvm::Value *CC = Builder.CreateFMul(RHSr, RHSr); // c*c |
869 | 0 | llvm::Value *DD = Builder.CreateFMul(RHSi, RHSi); // d*d |
870 | 0 | llvm::Value *CCpDD = Builder.CreateFAdd(CC, DD); // cc+dd |
871 | |
|
872 | 0 | llvm::Value *BC = Builder.CreateFMul(LHSi, RHSr); // b*c |
873 | 0 | llvm::Value *AD = Builder.CreateFMul(LHSr, RHSi); // a*d |
874 | 0 | llvm::Value *BCmAD = Builder.CreateFSub(BC, AD); // bc-ad |
875 | |
|
876 | 0 | DSTr = Builder.CreateFDiv(ACpBD, CCpDD); |
877 | 0 | DSTi = Builder.CreateFDiv(BCmAD, CCpDD); |
878 | 0 | return ComplexPairTy(DSTr, DSTi); |
879 | 0 | } |
880 | | |
881 | | // EmitFAbs - Emit a call to @llvm.fabs. |
882 | 0 | static llvm::Value *EmitllvmFAbs(CodeGenFunction &CGF, llvm::Value *Value) { |
883 | 0 | llvm::Function *Func = |
884 | 0 | CGF.CGM.getIntrinsic(llvm::Intrinsic::fabs, Value->getType()); |
885 | 0 | llvm::Value *Call = CGF.Builder.CreateCall(Func, Value); |
886 | 0 | return Call; |
887 | 0 | } |
888 | | |
889 | | // EmitRangeReductionDiv - Implements Smith's algorithm for complex division. |
890 | | // SMITH, R. L. Algorithm 116: Complex division. Commun. ACM 5, 8 (1962). |
891 | | ComplexPairTy ComplexExprEmitter::EmitRangeReductionDiv(llvm::Value *LHSr, |
892 | | llvm::Value *LHSi, |
893 | | llvm::Value *RHSr, |
894 | 0 | llvm::Value *RHSi) { |
895 | | // (a + ib) / (c + id) = (e + if) |
896 | 0 | llvm::Value *FAbsRHSr = EmitllvmFAbs(CGF, RHSr); // |c| |
897 | 0 | llvm::Value *FAbsRHSi = EmitllvmFAbs(CGF, RHSi); // |d| |
898 | | // |c| >= |d| |
899 | 0 | llvm::Value *IsR = Builder.CreateFCmpUGT(FAbsRHSr, FAbsRHSi, "abs_cmp"); |
900 | |
|
901 | 0 | llvm::BasicBlock *TrueBB = |
902 | 0 | CGF.createBasicBlock("abs_rhsr_greater_or_equal_abs_rhsi"); |
903 | 0 | llvm::BasicBlock *FalseBB = |
904 | 0 | CGF.createBasicBlock("abs_rhsr_less_than_abs_rhsi"); |
905 | 0 | llvm::BasicBlock *ContBB = CGF.createBasicBlock("complex_div"); |
906 | 0 | Builder.CreateCondBr(IsR, TrueBB, FalseBB); |
907 | |
|
908 | 0 | CGF.EmitBlock(TrueBB); |
909 | | // abs(c) >= abs(d) |
910 | | // r = d/c |
911 | | // tmp = c + rd |
912 | | // e = (a + br)/tmp |
913 | | // f = (b - ar)/tmp |
914 | 0 | llvm::Value *DdC = Builder.CreateFDiv(RHSi, RHSr); // r=d/c |
915 | |
|
916 | 0 | llvm::Value *RD = Builder.CreateFMul(DdC, RHSi); // rd |
917 | 0 | llvm::Value *CpRD = Builder.CreateFAdd(RHSr, RD); // tmp=c+rd |
918 | |
|
919 | 0 | llvm::Value *T3 = Builder.CreateFMul(LHSi, DdC); // br |
920 | 0 | llvm::Value *T4 = Builder.CreateFAdd(LHSr, T3); // a+br |
921 | 0 | llvm::Value *DSTTr = Builder.CreateFDiv(T4, CpRD); // (a+br)/tmp |
922 | |
|
923 | 0 | llvm::Value *T5 = Builder.CreateFMul(LHSr, DdC); // ar |
924 | 0 | llvm::Value *T6 = Builder.CreateFSub(LHSi, T5); // b-ar |
925 | 0 | llvm::Value *DSTTi = Builder.CreateFDiv(T6, CpRD); // (b-ar)/tmp |
926 | 0 | Builder.CreateBr(ContBB); |
927 | |
|
928 | 0 | CGF.EmitBlock(FalseBB); |
929 | | // abs(c) < abs(d) |
930 | | // r = c/d |
931 | | // tmp = d + rc |
932 | | // e = (ar + b)/tmp |
933 | | // f = (br - a)/tmp |
934 | 0 | llvm::Value *CdD = Builder.CreateFDiv(RHSr, RHSi); // r=c/d |
935 | |
|
936 | 0 | llvm::Value *RC = Builder.CreateFMul(CdD, RHSr); // rc |
937 | 0 | llvm::Value *DpRC = Builder.CreateFAdd(RHSi, RC); // tmp=d+rc |
938 | |
|
939 | 0 | llvm::Value *T7 = Builder.CreateFMul(LHSr, RC); // ar |
940 | 0 | llvm::Value *T8 = Builder.CreateFAdd(T7, LHSi); // ar+b |
941 | 0 | llvm::Value *DSTFr = Builder.CreateFDiv(T8, DpRC); // (ar+b)/tmp |
942 | |
|
943 | 0 | llvm::Value *T9 = Builder.CreateFMul(LHSi, CdD); // br |
944 | 0 | llvm::Value *T10 = Builder.CreateFSub(T9, LHSr); // br-a |
945 | 0 | llvm::Value *DSTFi = Builder.CreateFDiv(T10, DpRC); // (br-a)/tmp |
946 | 0 | Builder.CreateBr(ContBB); |
947 | | |
948 | | // Phi together the computation paths. |
949 | 0 | CGF.EmitBlock(ContBB); |
950 | 0 | llvm::PHINode *VALr = Builder.CreatePHI(DSTTr->getType(), 2); |
951 | 0 | VALr->addIncoming(DSTTr, TrueBB); |
952 | 0 | VALr->addIncoming(DSTFr, FalseBB); |
953 | 0 | llvm::PHINode *VALi = Builder.CreatePHI(DSTTi->getType(), 2); |
954 | 0 | VALi->addIncoming(DSTTi, TrueBB); |
955 | 0 | VALi->addIncoming(DSTFi, FalseBB); |
956 | 0 | return ComplexPairTy(VALr, VALi); |
957 | 0 | } |
958 | | |
959 | | // See C11 Annex G.5.1 for the semantics of multiplicative operators on complex |
960 | | // typed values. |
961 | 0 | ComplexPairTy ComplexExprEmitter::EmitBinDiv(const BinOpInfo &Op) { |
962 | 0 | llvm::Value *LHSr = Op.LHS.first, *LHSi = Op.LHS.second; |
963 | 0 | llvm::Value *RHSr = Op.RHS.first, *RHSi = Op.RHS.second; |
964 | 0 | llvm::Value *DSTr, *DSTi; |
965 | 0 | if (LHSr->getType()->isFloatingPointTy()) { |
966 | 0 | CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Op.FPFeatures); |
967 | 0 | if (!RHSi) { |
968 | 0 | assert(LHSi && "Can have at most one non-complex operand!"); |
969 | | |
970 | 0 | DSTr = Builder.CreateFDiv(LHSr, RHSr); |
971 | 0 | DSTi = Builder.CreateFDiv(LHSi, RHSr); |
972 | 0 | return ComplexPairTy(DSTr, DSTi); |
973 | 0 | } |
974 | 0 | llvm::Value *OrigLHSi = LHSi; |
975 | 0 | if (!LHSi) |
976 | 0 | LHSi = llvm::Constant::getNullValue(RHSi->getType()); |
977 | 0 | if (Op.FPFeatures.getComplexRange() == LangOptions::CX_Fortran) |
978 | 0 | return EmitRangeReductionDiv(LHSr, LHSi, RHSr, RHSi); |
979 | 0 | else if (Op.FPFeatures.getComplexRange() == LangOptions::CX_Limited) |
980 | 0 | return EmitAlgebraicDiv(LHSr, LHSi, RHSr, RHSi); |
981 | 0 | else if (!CGF.getLangOpts().FastMath) { |
982 | 0 | LHSi = OrigLHSi; |
983 | | // If we have a complex operand on the RHS and FastMath is not allowed, we |
984 | | // delegate to a libcall to handle all of the complexities and minimize |
985 | | // underflow/overflow cases. When FastMath is allowed we construct the |
986 | | // divide inline using the same algorithm as for integer operands. |
987 | | // |
988 | | // FIXME: We would be able to avoid the libcall in many places if we |
989 | | // supported imaginary types in addition to complex types. |
990 | 0 | BinOpInfo LibCallOp = Op; |
991 | | // If LHS was a real, supply a null imaginary part. |
992 | 0 | if (!LHSi) |
993 | 0 | LibCallOp.LHS.second = llvm::Constant::getNullValue(LHSr->getType()); |
994 | |
|
995 | 0 | switch (LHSr->getType()->getTypeID()) { |
996 | 0 | default: |
997 | 0 | llvm_unreachable("Unsupported floating point type!"); |
998 | 0 | case llvm::Type::HalfTyID: |
999 | 0 | return EmitComplexBinOpLibCall("__divhc3", LibCallOp); |
1000 | 0 | case llvm::Type::FloatTyID: |
1001 | 0 | return EmitComplexBinOpLibCall("__divsc3", LibCallOp); |
1002 | 0 | case llvm::Type::DoubleTyID: |
1003 | 0 | return EmitComplexBinOpLibCall("__divdc3", LibCallOp); |
1004 | 0 | case llvm::Type::PPC_FP128TyID: |
1005 | 0 | return EmitComplexBinOpLibCall("__divtc3", LibCallOp); |
1006 | 0 | case llvm::Type::X86_FP80TyID: |
1007 | 0 | return EmitComplexBinOpLibCall("__divxc3", LibCallOp); |
1008 | 0 | case llvm::Type::FP128TyID: |
1009 | 0 | return EmitComplexBinOpLibCall("__divtc3", LibCallOp); |
1010 | 0 | } |
1011 | 0 | } else { |
1012 | 0 | return EmitAlgebraicDiv(LHSr, LHSi, RHSr, RHSi); |
1013 | 0 | } |
1014 | 0 | } else { |
1015 | 0 | assert(Op.LHS.second && Op.RHS.second && |
1016 | 0 | "Both operands of integer complex operators must be complex!"); |
1017 | | // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd)) |
1018 | 0 | llvm::Value *Tmp1 = Builder.CreateMul(LHSr, RHSr); // a*c |
1019 | 0 | llvm::Value *Tmp2 = Builder.CreateMul(LHSi, RHSi); // b*d |
1020 | 0 | llvm::Value *Tmp3 = Builder.CreateAdd(Tmp1, Tmp2); // ac+bd |
1021 | |
|
1022 | 0 | llvm::Value *Tmp4 = Builder.CreateMul(RHSr, RHSr); // c*c |
1023 | 0 | llvm::Value *Tmp5 = Builder.CreateMul(RHSi, RHSi); // d*d |
1024 | 0 | llvm::Value *Tmp6 = Builder.CreateAdd(Tmp4, Tmp5); // cc+dd |
1025 | |
|
1026 | 0 | llvm::Value *Tmp7 = Builder.CreateMul(LHSi, RHSr); // b*c |
1027 | 0 | llvm::Value *Tmp8 = Builder.CreateMul(LHSr, RHSi); // a*d |
1028 | 0 | llvm::Value *Tmp9 = Builder.CreateSub(Tmp7, Tmp8); // bc-ad |
1029 | |
|
1030 | 0 | if (Op.Ty->castAs<ComplexType>()->getElementType()->isUnsignedIntegerType()) { |
1031 | 0 | DSTr = Builder.CreateUDiv(Tmp3, Tmp6); |
1032 | 0 | DSTi = Builder.CreateUDiv(Tmp9, Tmp6); |
1033 | 0 | } else { |
1034 | 0 | DSTr = Builder.CreateSDiv(Tmp3, Tmp6); |
1035 | 0 | DSTi = Builder.CreateSDiv(Tmp9, Tmp6); |
1036 | 0 | } |
1037 | 0 | } |
1038 | | |
1039 | 0 | return ComplexPairTy(DSTr, DSTi); |
1040 | 0 | } |
1041 | | |
1042 | | ComplexPairTy CodeGenFunction::EmitUnPromotedValue(ComplexPairTy result, |
1043 | 0 | QualType UnPromotionType) { |
1044 | 0 | llvm::Type *ComplexElementTy = |
1045 | 0 | ConvertType(UnPromotionType->castAs<ComplexType>()->getElementType()); |
1046 | 0 | if (result.first) |
1047 | 0 | result.first = |
1048 | 0 | Builder.CreateFPTrunc(result.first, ComplexElementTy, "unpromotion"); |
1049 | 0 | if (result.second) |
1050 | 0 | result.second = |
1051 | 0 | Builder.CreateFPTrunc(result.second, ComplexElementTy, "unpromotion"); |
1052 | 0 | return result; |
1053 | 0 | } |
1054 | | |
1055 | | ComplexPairTy CodeGenFunction::EmitPromotedValue(ComplexPairTy result, |
1056 | 0 | QualType PromotionType) { |
1057 | 0 | llvm::Type *ComplexElementTy = |
1058 | 0 | ConvertType(PromotionType->castAs<ComplexType>()->getElementType()); |
1059 | 0 | if (result.first) |
1060 | 0 | result.first = Builder.CreateFPExt(result.first, ComplexElementTy, "ext"); |
1061 | 0 | if (result.second) |
1062 | 0 | result.second = Builder.CreateFPExt(result.second, ComplexElementTy, "ext"); |
1063 | |
|
1064 | 0 | return result; |
1065 | 0 | } |
1066 | | |
1067 | | ComplexPairTy ComplexExprEmitter::EmitPromoted(const Expr *E, |
1068 | 0 | QualType PromotionType) { |
1069 | 0 | E = E->IgnoreParens(); |
1070 | 0 | if (auto BO = dyn_cast<BinaryOperator>(E)) { |
1071 | 0 | switch (BO->getOpcode()) { |
1072 | 0 | #define HANDLE_BINOP(OP) \ |
1073 | 0 | case BO_##OP: \ |
1074 | 0 | return EmitBin##OP(EmitBinOps(BO, PromotionType)); |
1075 | 0 | HANDLE_BINOP(Add) |
1076 | 0 | HANDLE_BINOP(Sub) |
1077 | 0 | HANDLE_BINOP(Mul) |
1078 | 0 | HANDLE_BINOP(Div) |
1079 | 0 | #undef HANDLE_BINOP |
1080 | 0 | default: |
1081 | 0 | break; |
1082 | 0 | } |
1083 | 0 | } else if (auto UO = dyn_cast<UnaryOperator>(E)) { |
1084 | 0 | switch (UO->getOpcode()) { |
1085 | 0 | case UO_Minus: |
1086 | 0 | return VisitMinus(UO, PromotionType); |
1087 | 0 | case UO_Plus: |
1088 | 0 | return VisitPlus(UO, PromotionType); |
1089 | 0 | default: |
1090 | 0 | break; |
1091 | 0 | } |
1092 | 0 | } |
1093 | 0 | auto result = Visit(const_cast<Expr *>(E)); |
1094 | 0 | if (!PromotionType.isNull()) |
1095 | 0 | return CGF.EmitPromotedValue(result, PromotionType); |
1096 | 0 | else |
1097 | 0 | return result; |
1098 | 0 | } |
1099 | | |
1100 | | ComplexPairTy CodeGenFunction::EmitPromotedComplexExpr(const Expr *E, |
1101 | 0 | QualType DstTy) { |
1102 | 0 | return ComplexExprEmitter(*this).EmitPromoted(E, DstTy); |
1103 | 0 | } |
1104 | | |
1105 | | ComplexPairTy |
1106 | | ComplexExprEmitter::EmitPromotedComplexOperand(const Expr *E, |
1107 | 0 | QualType OverallPromotionType) { |
1108 | 0 | if (E->getType()->isAnyComplexType()) { |
1109 | 0 | if (!OverallPromotionType.isNull()) |
1110 | 0 | return CGF.EmitPromotedComplexExpr(E, OverallPromotionType); |
1111 | 0 | else |
1112 | 0 | return Visit(const_cast<Expr *>(E)); |
1113 | 0 | } else { |
1114 | 0 | if (!OverallPromotionType.isNull()) { |
1115 | 0 | QualType ComplexElementTy = |
1116 | 0 | OverallPromotionType->castAs<ComplexType>()->getElementType(); |
1117 | 0 | return ComplexPairTy(CGF.EmitPromotedScalarExpr(E, ComplexElementTy), |
1118 | 0 | nullptr); |
1119 | 0 | } else { |
1120 | 0 | return ComplexPairTy(CGF.EmitScalarExpr(E), nullptr); |
1121 | 0 | } |
1122 | 0 | } |
1123 | 0 | } |
1124 | | |
1125 | | ComplexExprEmitter::BinOpInfo |
1126 | | ComplexExprEmitter::EmitBinOps(const BinaryOperator *E, |
1127 | 0 | QualType PromotionType) { |
1128 | 0 | TestAndClearIgnoreReal(); |
1129 | 0 | TestAndClearIgnoreImag(); |
1130 | 0 | BinOpInfo Ops; |
1131 | |
|
1132 | 0 | Ops.LHS = EmitPromotedComplexOperand(E->getLHS(), PromotionType); |
1133 | 0 | Ops.RHS = EmitPromotedComplexOperand(E->getRHS(), PromotionType); |
1134 | 0 | if (!PromotionType.isNull()) |
1135 | 0 | Ops.Ty = PromotionType; |
1136 | 0 | else |
1137 | 0 | Ops.Ty = E->getType(); |
1138 | 0 | Ops.FPFeatures = E->getFPFeaturesInEffect(CGF.getLangOpts()); |
1139 | 0 | return Ops; |
1140 | 0 | } |
1141 | | |
1142 | | |
1143 | | LValue ComplexExprEmitter:: |
1144 | | EmitCompoundAssignLValue(const CompoundAssignOperator *E, |
1145 | | ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&), |
1146 | 0 | RValue &Val) { |
1147 | 0 | TestAndClearIgnoreReal(); |
1148 | 0 | TestAndClearIgnoreImag(); |
1149 | 0 | QualType LHSTy = E->getLHS()->getType(); |
1150 | 0 | if (const AtomicType *AT = LHSTy->getAs<AtomicType>()) |
1151 | 0 | LHSTy = AT->getValueType(); |
1152 | |
|
1153 | 0 | BinOpInfo OpInfo; |
1154 | 0 | OpInfo.FPFeatures = E->getFPFeaturesInEffect(CGF.getLangOpts()); |
1155 | 0 | CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, OpInfo.FPFeatures); |
1156 | | |
1157 | | // Load the RHS and LHS operands. |
1158 | | // __block variables need to have the rhs evaluated first, plus this should |
1159 | | // improve codegen a little. |
1160 | 0 | QualType PromotionTypeCR; |
1161 | 0 | PromotionTypeCR = getPromotionType(E->getComputationResultType()); |
1162 | 0 | if (PromotionTypeCR.isNull()) |
1163 | 0 | PromotionTypeCR = E->getComputationResultType(); |
1164 | 0 | OpInfo.Ty = PromotionTypeCR; |
1165 | 0 | QualType ComplexElementTy = |
1166 | 0 | OpInfo.Ty->castAs<ComplexType>()->getElementType(); |
1167 | 0 | QualType PromotionTypeRHS = getPromotionType(E->getRHS()->getType()); |
1168 | | |
1169 | | // The RHS should have been converted to the computation type. |
1170 | 0 | if (E->getRHS()->getType()->isRealFloatingType()) { |
1171 | 0 | if (!PromotionTypeRHS.isNull()) |
1172 | 0 | OpInfo.RHS = ComplexPairTy( |
1173 | 0 | CGF.EmitPromotedScalarExpr(E->getRHS(), PromotionTypeRHS), nullptr); |
1174 | 0 | else { |
1175 | 0 | assert(CGF.getContext().hasSameUnqualifiedType(ComplexElementTy, |
1176 | 0 | E->getRHS()->getType())); |
1177 | | |
1178 | 0 | OpInfo.RHS = ComplexPairTy(CGF.EmitScalarExpr(E->getRHS()), nullptr); |
1179 | 0 | } |
1180 | 0 | } else { |
1181 | 0 | if (!PromotionTypeRHS.isNull()) { |
1182 | 0 | OpInfo.RHS = ComplexPairTy( |
1183 | 0 | CGF.EmitPromotedComplexExpr(E->getRHS(), PromotionTypeRHS)); |
1184 | 0 | } else { |
1185 | 0 | assert(CGF.getContext().hasSameUnqualifiedType(OpInfo.Ty, |
1186 | 0 | E->getRHS()->getType())); |
1187 | 0 | OpInfo.RHS = Visit(E->getRHS()); |
1188 | 0 | } |
1189 | 0 | } |
1190 | | |
1191 | 0 | LValue LHS = CGF.EmitLValue(E->getLHS()); |
1192 | | |
1193 | | // Load from the l-value and convert it. |
1194 | 0 | SourceLocation Loc = E->getExprLoc(); |
1195 | 0 | QualType PromotionTypeLHS = getPromotionType(E->getComputationLHSType()); |
1196 | 0 | if (LHSTy->isAnyComplexType()) { |
1197 | 0 | ComplexPairTy LHSVal = EmitLoadOfLValue(LHS, Loc); |
1198 | 0 | if (!PromotionTypeLHS.isNull()) |
1199 | 0 | OpInfo.LHS = |
1200 | 0 | EmitComplexToComplexCast(LHSVal, LHSTy, PromotionTypeLHS, Loc); |
1201 | 0 | else |
1202 | 0 | OpInfo.LHS = EmitComplexToComplexCast(LHSVal, LHSTy, OpInfo.Ty, Loc); |
1203 | 0 | } else { |
1204 | 0 | llvm::Value *LHSVal = CGF.EmitLoadOfScalar(LHS, Loc); |
1205 | | // For floating point real operands we can directly pass the scalar form |
1206 | | // to the binary operator emission and potentially get more efficient code. |
1207 | 0 | if (LHSTy->isRealFloatingType()) { |
1208 | 0 | QualType PromotedComplexElementTy; |
1209 | 0 | if (!PromotionTypeLHS.isNull()) { |
1210 | 0 | PromotedComplexElementTy = |
1211 | 0 | cast<ComplexType>(PromotionTypeLHS)->getElementType(); |
1212 | 0 | if (!CGF.getContext().hasSameUnqualifiedType(PromotedComplexElementTy, |
1213 | 0 | PromotionTypeLHS)) |
1214 | 0 | LHSVal = CGF.EmitScalarConversion(LHSVal, LHSTy, |
1215 | 0 | PromotedComplexElementTy, Loc); |
1216 | 0 | } else { |
1217 | 0 | if (!CGF.getContext().hasSameUnqualifiedType(ComplexElementTy, LHSTy)) |
1218 | 0 | LHSVal = |
1219 | 0 | CGF.EmitScalarConversion(LHSVal, LHSTy, ComplexElementTy, Loc); |
1220 | 0 | } |
1221 | 0 | OpInfo.LHS = ComplexPairTy(LHSVal, nullptr); |
1222 | 0 | } else { |
1223 | 0 | OpInfo.LHS = EmitScalarToComplexCast(LHSVal, LHSTy, OpInfo.Ty, Loc); |
1224 | 0 | } |
1225 | 0 | } |
1226 | | |
1227 | | // Expand the binary operator. |
1228 | 0 | ComplexPairTy Result = (this->*Func)(OpInfo); |
1229 | | |
1230 | | // Truncate the result and store it into the LHS lvalue. |
1231 | 0 | if (LHSTy->isAnyComplexType()) { |
1232 | 0 | ComplexPairTy ResVal = |
1233 | 0 | EmitComplexToComplexCast(Result, OpInfo.Ty, LHSTy, Loc); |
1234 | 0 | EmitStoreOfComplex(ResVal, LHS, /*isInit*/ false); |
1235 | 0 | Val = RValue::getComplex(ResVal); |
1236 | 0 | } else { |
1237 | 0 | llvm::Value *ResVal = |
1238 | 0 | CGF.EmitComplexToScalarConversion(Result, OpInfo.Ty, LHSTy, Loc); |
1239 | 0 | CGF.EmitStoreOfScalar(ResVal, LHS, /*isInit*/ false); |
1240 | 0 | Val = RValue::get(ResVal); |
1241 | 0 | } |
1242 | |
|
1243 | 0 | return LHS; |
1244 | 0 | } |
1245 | | |
1246 | | // Compound assignments. |
1247 | | ComplexPairTy ComplexExprEmitter:: |
1248 | | EmitCompoundAssign(const CompoundAssignOperator *E, |
1249 | 0 | ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&)){ |
1250 | 0 | RValue Val; |
1251 | 0 | LValue LV = EmitCompoundAssignLValue(E, Func, Val); |
1252 | | |
1253 | | // The result of an assignment in C is the assigned r-value. |
1254 | 0 | if (!CGF.getLangOpts().CPlusPlus) |
1255 | 0 | return Val.getComplexVal(); |
1256 | | |
1257 | | // If the lvalue is non-volatile, return the computed value of the assignment. |
1258 | 0 | if (!LV.isVolatileQualified()) |
1259 | 0 | return Val.getComplexVal(); |
1260 | | |
1261 | 0 | return EmitLoadOfLValue(LV, E->getExprLoc()); |
1262 | 0 | } |
1263 | | |
1264 | | LValue ComplexExprEmitter::EmitBinAssignLValue(const BinaryOperator *E, |
1265 | 0 | ComplexPairTy &Val) { |
1266 | 0 | assert(CGF.getContext().hasSameUnqualifiedType(E->getLHS()->getType(), |
1267 | 0 | E->getRHS()->getType()) && |
1268 | 0 | "Invalid assignment"); |
1269 | 0 | TestAndClearIgnoreReal(); |
1270 | 0 | TestAndClearIgnoreImag(); |
1271 | | |
1272 | | // Emit the RHS. __block variables need the RHS evaluated first. |
1273 | 0 | Val = Visit(E->getRHS()); |
1274 | | |
1275 | | // Compute the address to store into. |
1276 | 0 | LValue LHS = CGF.EmitLValue(E->getLHS()); |
1277 | | |
1278 | | // Store the result value into the LHS lvalue. |
1279 | 0 | EmitStoreOfComplex(Val, LHS, /*isInit*/ false); |
1280 | |
|
1281 | 0 | return LHS; |
1282 | 0 | } |
1283 | | |
1284 | 0 | ComplexPairTy ComplexExprEmitter::VisitBinAssign(const BinaryOperator *E) { |
1285 | 0 | ComplexPairTy Val; |
1286 | 0 | LValue LV = EmitBinAssignLValue(E, Val); |
1287 | | |
1288 | | // The result of an assignment in C is the assigned r-value. |
1289 | 0 | if (!CGF.getLangOpts().CPlusPlus) |
1290 | 0 | return Val; |
1291 | | |
1292 | | // If the lvalue is non-volatile, return the computed value of the assignment. |
1293 | 0 | if (!LV.isVolatileQualified()) |
1294 | 0 | return Val; |
1295 | | |
1296 | 0 | return EmitLoadOfLValue(LV, E->getExprLoc()); |
1297 | 0 | } |
1298 | | |
1299 | 0 | ComplexPairTy ComplexExprEmitter::VisitBinComma(const BinaryOperator *E) { |
1300 | 0 | CGF.EmitIgnoredExpr(E->getLHS()); |
1301 | 0 | return Visit(E->getRHS()); |
1302 | 0 | } |
1303 | | |
1304 | | ComplexPairTy ComplexExprEmitter:: |
1305 | 0 | VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { |
1306 | 0 | TestAndClearIgnoreReal(); |
1307 | 0 | TestAndClearIgnoreImag(); |
1308 | 0 | llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.true"); |
1309 | 0 | llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false"); |
1310 | 0 | llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end"); |
1311 | | |
1312 | | // Bind the common expression if necessary. |
1313 | 0 | CodeGenFunction::OpaqueValueMapping binding(CGF, E); |
1314 | | |
1315 | |
|
1316 | 0 | CodeGenFunction::ConditionalEvaluation eval(CGF); |
1317 | 0 | CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock, |
1318 | 0 | CGF.getProfileCount(E)); |
1319 | |
|
1320 | 0 | eval.begin(CGF); |
1321 | 0 | CGF.EmitBlock(LHSBlock); |
1322 | 0 | CGF.incrementProfileCounter(E); |
1323 | 0 | ComplexPairTy LHS = Visit(E->getTrueExpr()); |
1324 | 0 | LHSBlock = Builder.GetInsertBlock(); |
1325 | 0 | CGF.EmitBranch(ContBlock); |
1326 | 0 | eval.end(CGF); |
1327 | |
|
1328 | 0 | eval.begin(CGF); |
1329 | 0 | CGF.EmitBlock(RHSBlock); |
1330 | 0 | ComplexPairTy RHS = Visit(E->getFalseExpr()); |
1331 | 0 | RHSBlock = Builder.GetInsertBlock(); |
1332 | 0 | CGF.EmitBlock(ContBlock); |
1333 | 0 | eval.end(CGF); |
1334 | | |
1335 | | // Create a PHI node for the real part. |
1336 | 0 | llvm::PHINode *RealPN = Builder.CreatePHI(LHS.first->getType(), 2, "cond.r"); |
1337 | 0 | RealPN->addIncoming(LHS.first, LHSBlock); |
1338 | 0 | RealPN->addIncoming(RHS.first, RHSBlock); |
1339 | | |
1340 | | // Create a PHI node for the imaginary part. |
1341 | 0 | llvm::PHINode *ImagPN = Builder.CreatePHI(LHS.first->getType(), 2, "cond.i"); |
1342 | 0 | ImagPN->addIncoming(LHS.second, LHSBlock); |
1343 | 0 | ImagPN->addIncoming(RHS.second, RHSBlock); |
1344 | |
|
1345 | 0 | return ComplexPairTy(RealPN, ImagPN); |
1346 | 0 | } |
1347 | | |
1348 | 0 | ComplexPairTy ComplexExprEmitter::VisitChooseExpr(ChooseExpr *E) { |
1349 | 0 | return Visit(E->getChosenSubExpr()); |
1350 | 0 | } |
1351 | | |
1352 | 0 | ComplexPairTy ComplexExprEmitter::VisitInitListExpr(InitListExpr *E) { |
1353 | 0 | bool Ignore = TestAndClearIgnoreReal(); |
1354 | 0 | (void)Ignore; |
1355 | 0 | assert (Ignore == false && "init list ignored"); |
1356 | 0 | Ignore = TestAndClearIgnoreImag(); |
1357 | 0 | (void)Ignore; |
1358 | 0 | assert (Ignore == false && "init list ignored"); |
1359 | | |
1360 | 0 | if (E->getNumInits() == 2) { |
1361 | 0 | llvm::Value *Real = CGF.EmitScalarExpr(E->getInit(0)); |
1362 | 0 | llvm::Value *Imag = CGF.EmitScalarExpr(E->getInit(1)); |
1363 | 0 | return ComplexPairTy(Real, Imag); |
1364 | 0 | } else if (E->getNumInits() == 1) { |
1365 | 0 | return Visit(E->getInit(0)); |
1366 | 0 | } |
1367 | | |
1368 | | // Empty init list initializes to null |
1369 | 0 | assert(E->getNumInits() == 0 && "Unexpected number of inits"); |
1370 | 0 | QualType Ty = E->getType()->castAs<ComplexType>()->getElementType(); |
1371 | 0 | llvm::Type* LTy = CGF.ConvertType(Ty); |
1372 | 0 | llvm::Value* zeroConstant = llvm::Constant::getNullValue(LTy); |
1373 | 0 | return ComplexPairTy(zeroConstant, zeroConstant); |
1374 | 0 | } |
1375 | | |
1376 | 0 | ComplexPairTy ComplexExprEmitter::VisitVAArgExpr(VAArgExpr *E) { |
1377 | 0 | Address ArgValue = Address::invalid(); |
1378 | 0 | Address ArgPtr = CGF.EmitVAArg(E, ArgValue); |
1379 | |
|
1380 | 0 | if (!ArgPtr.isValid()) { |
1381 | 0 | CGF.ErrorUnsupported(E, "complex va_arg expression"); |
1382 | 0 | llvm::Type *EltTy = |
1383 | 0 | CGF.ConvertType(E->getType()->castAs<ComplexType>()->getElementType()); |
1384 | 0 | llvm::Value *U = llvm::UndefValue::get(EltTy); |
1385 | 0 | return ComplexPairTy(U, U); |
1386 | 0 | } |
1387 | | |
1388 | 0 | return EmitLoadOfLValue(CGF.MakeAddrLValue(ArgPtr, E->getType()), |
1389 | 0 | E->getExprLoc()); |
1390 | 0 | } |
1391 | | |
1392 | | //===----------------------------------------------------------------------===// |
1393 | | // Entry Point into this File |
1394 | | //===----------------------------------------------------------------------===// |
1395 | | |
1396 | | /// EmitComplexExpr - Emit the computation of the specified expression of |
1397 | | /// complex type, ignoring the result. |
1398 | | ComplexPairTy CodeGenFunction::EmitComplexExpr(const Expr *E, bool IgnoreReal, |
1399 | 0 | bool IgnoreImag) { |
1400 | 0 | assert(E && getComplexType(E->getType()) && |
1401 | 0 | "Invalid complex expression to emit"); |
1402 | | |
1403 | 0 | return ComplexExprEmitter(*this, IgnoreReal, IgnoreImag) |
1404 | 0 | .Visit(const_cast<Expr *>(E)); |
1405 | 0 | } |
1406 | | |
1407 | | void CodeGenFunction::EmitComplexExprIntoLValue(const Expr *E, LValue dest, |
1408 | 0 | bool isInit) { |
1409 | 0 | assert(E && getComplexType(E->getType()) && |
1410 | 0 | "Invalid complex expression to emit"); |
1411 | 0 | ComplexExprEmitter Emitter(*this); |
1412 | 0 | ComplexPairTy Val = Emitter.Visit(const_cast<Expr*>(E)); |
1413 | 0 | Emitter.EmitStoreOfComplex(Val, dest, isInit); |
1414 | 0 | } |
1415 | | |
1416 | | /// EmitStoreOfComplex - Store a complex number into the specified l-value. |
1417 | | void CodeGenFunction::EmitStoreOfComplex(ComplexPairTy V, LValue dest, |
1418 | 0 | bool isInit) { |
1419 | 0 | ComplexExprEmitter(*this).EmitStoreOfComplex(V, dest, isInit); |
1420 | 0 | } |
1421 | | |
1422 | | /// EmitLoadOfComplex - Load a complex number from the specified address. |
1423 | | ComplexPairTy CodeGenFunction::EmitLoadOfComplex(LValue src, |
1424 | 0 | SourceLocation loc) { |
1425 | 0 | return ComplexExprEmitter(*this).EmitLoadOfLValue(src, loc); |
1426 | 0 | } |
1427 | | |
1428 | 0 | LValue CodeGenFunction::EmitComplexAssignmentLValue(const BinaryOperator *E) { |
1429 | 0 | assert(E->getOpcode() == BO_Assign); |
1430 | 0 | ComplexPairTy Val; // ignored |
1431 | 0 | LValue LVal = ComplexExprEmitter(*this).EmitBinAssignLValue(E, Val); |
1432 | 0 | if (getLangOpts().OpenMP) |
1433 | 0 | CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(*this, |
1434 | 0 | E->getLHS()); |
1435 | 0 | return LVal; |
1436 | 0 | } |
1437 | | |
1438 | | typedef ComplexPairTy (ComplexExprEmitter::*CompoundFunc)( |
1439 | | const ComplexExprEmitter::BinOpInfo &); |
1440 | | |
1441 | 0 | static CompoundFunc getComplexOp(BinaryOperatorKind Op) { |
1442 | 0 | switch (Op) { |
1443 | 0 | case BO_MulAssign: return &ComplexExprEmitter::EmitBinMul; |
1444 | 0 | case BO_DivAssign: return &ComplexExprEmitter::EmitBinDiv; |
1445 | 0 | case BO_SubAssign: return &ComplexExprEmitter::EmitBinSub; |
1446 | 0 | case BO_AddAssign: return &ComplexExprEmitter::EmitBinAdd; |
1447 | 0 | default: |
1448 | 0 | llvm_unreachable("unexpected complex compound assignment"); |
1449 | 0 | } |
1450 | 0 | } |
1451 | | |
1452 | | LValue CodeGenFunction:: |
1453 | 0 | EmitComplexCompoundAssignmentLValue(const CompoundAssignOperator *E) { |
1454 | 0 | CompoundFunc Op = getComplexOp(E->getOpcode()); |
1455 | 0 | RValue Val; |
1456 | 0 | return ComplexExprEmitter(*this).EmitCompoundAssignLValue(E, Op, Val); |
1457 | 0 | } |
1458 | | |
1459 | | LValue CodeGenFunction:: |
1460 | | EmitScalarCompoundAssignWithComplex(const CompoundAssignOperator *E, |
1461 | 0 | llvm::Value *&Result) { |
1462 | 0 | CompoundFunc Op = getComplexOp(E->getOpcode()); |
1463 | 0 | RValue Val; |
1464 | 0 | LValue Ret = ComplexExprEmitter(*this).EmitCompoundAssignLValue(E, Op, Val); |
1465 | 0 | Result = Val.getScalarVal(); |
1466 | 0 | return Ret; |
1467 | 0 | } |