Coverage Report

Created: 2024-01-17 10:31

/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
}