1//===--- CGAtomic.cpp - Emit LLVM IR for atomic operations ----------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the code for emitting atomic operations.
11//
12//===----------------------------------------------------------------------===//
13
14#include "CodeGenFunction.h"
15#include "CGCall.h"
16#include "CGRecordLayout.h"
17#include "CodeGenModule.h"
18#include "clang/AST/ASTContext.h"
19#include "clang/CodeGen/CGFunctionInfo.h"
20#include "llvm/ADT/StringExtras.h"
21#include "llvm/IR/DataLayout.h"
22#include "llvm/IR/Intrinsics.h"
23#include "llvm/IR/Operator.h"
24
25using namespace clang;
26using namespace CodeGen;
27
28namespace {
29  class AtomicInfo {
30    CodeGenFunction &CGF;
31    QualType AtomicTy;
32    QualType ValueTy;
33    uint64_t AtomicSizeInBits;
34    uint64_t ValueSizeInBits;
35    CharUnits AtomicAlign;
36    CharUnits ValueAlign;
37    CharUnits LValueAlign;
38    TypeEvaluationKind EvaluationKind;
39    bool UseLibcall;
40    LValue LVal;
41    CGBitFieldInfo BFI;
42  public:
43    AtomicInfo(CodeGenFunction &CGF, LValue &lvalue)
44        : CGF(CGF), AtomicSizeInBits(0), ValueSizeInBits(0),
45          EvaluationKind(TEK_Scalar), UseLibcall(true) {
46      assert(!lvalue.isGlobalReg());
47      ASTContext &C = CGF.getContext();
48      if (lvalue.isSimple()) {
49        AtomicTy = lvalue.getType();
50        if (auto *ATy = AtomicTy->getAs<AtomicType>())
51          ValueTy = ATy->getValueType();
52        else
53          ValueTy = AtomicTy;
54        EvaluationKind = CGF.getEvaluationKind(ValueTy);
55
56        uint64_t ValueAlignInBits;
57        uint64_t AtomicAlignInBits;
58        TypeInfo ValueTI = C.getTypeInfo(ValueTy);
59        ValueSizeInBits = ValueTI.Width;
60        ValueAlignInBits = ValueTI.Align;
61
62        TypeInfo AtomicTI = C.getTypeInfo(AtomicTy);
63        AtomicSizeInBits = AtomicTI.Width;
64        AtomicAlignInBits = AtomicTI.Align;
65
66        assert(ValueSizeInBits <= AtomicSizeInBits);
67        assert(ValueAlignInBits <= AtomicAlignInBits);
68
69        AtomicAlign = C.toCharUnitsFromBits(AtomicAlignInBits);
70        ValueAlign = C.toCharUnitsFromBits(ValueAlignInBits);
71        if (lvalue.getAlignment().isZero())
72          lvalue.setAlignment(AtomicAlign);
73
74        LVal = lvalue;
75      } else if (lvalue.isBitField()) {
76        ValueTy = lvalue.getType();
77        ValueSizeInBits = C.getTypeSize(ValueTy);
78        auto &OrigBFI = lvalue.getBitFieldInfo();
79        auto Offset = OrigBFI.Offset % C.toBits(lvalue.getAlignment());
80        AtomicSizeInBits = C.toBits(
81            C.toCharUnitsFromBits(Offset + OrigBFI.Size + C.getCharWidth() - 1)
82                .RoundUpToAlignment(lvalue.getAlignment()));
83        auto VoidPtrAddr = CGF.EmitCastToVoidPtr(lvalue.getBitFieldPointer());
84        auto OffsetInChars =
85            (C.toCharUnitsFromBits(OrigBFI.Offset) / lvalue.getAlignment()) *
86            lvalue.getAlignment();
87        VoidPtrAddr = CGF.Builder.CreateConstGEP1_64(
88            VoidPtrAddr, OffsetInChars.getQuantity());
89        auto Addr = CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
90            VoidPtrAddr,
91            CGF.Builder.getIntNTy(AtomicSizeInBits)->getPointerTo(),
92            "atomic_bitfield_base");
93        BFI = OrigBFI;
94        BFI.Offset = Offset;
95        BFI.StorageSize = AtomicSizeInBits;
96        BFI.StorageOffset += OffsetInChars;
97        LVal = LValue::MakeBitfield(Address(Addr, lvalue.getAlignment()),
98                                    BFI, lvalue.getType(),
99                                    lvalue.getAlignmentSource());
100        LVal.setTBAAInfo(lvalue.getTBAAInfo());
101        AtomicTy = C.getIntTypeForBitwidth(AtomicSizeInBits, OrigBFI.IsSigned);
102        if (AtomicTy.isNull()) {
103          llvm::APInt Size(
104              /*numBits=*/32,
105              C.toCharUnitsFromBits(AtomicSizeInBits).getQuantity());
106          AtomicTy = C.getConstantArrayType(C.CharTy, Size, ArrayType::Normal,
107                                            /*IndexTypeQuals=*/0);
108        }
109        AtomicAlign = ValueAlign = lvalue.getAlignment();
110      } else if (lvalue.isVectorElt()) {
111        ValueTy = lvalue.getType()->getAs<VectorType>()->getElementType();
112        ValueSizeInBits = C.getTypeSize(ValueTy);
113        AtomicTy = lvalue.getType();
114        AtomicSizeInBits = C.getTypeSize(AtomicTy);
115        AtomicAlign = ValueAlign = lvalue.getAlignment();
116        LVal = lvalue;
117      } else {
118        assert(lvalue.isExtVectorElt());
119        ValueTy = lvalue.getType();
120        ValueSizeInBits = C.getTypeSize(ValueTy);
121        AtomicTy = ValueTy = CGF.getContext().getExtVectorType(
122            lvalue.getType(), lvalue.getExtVectorAddress()
123                                  .getElementType()->getVectorNumElements());
124        AtomicSizeInBits = C.getTypeSize(AtomicTy);
125        AtomicAlign = ValueAlign = lvalue.getAlignment();
126        LVal = lvalue;
127      }
128      UseLibcall = !C.getTargetInfo().hasBuiltinAtomic(
129          AtomicSizeInBits, C.toBits(lvalue.getAlignment()));
130    }
131
132    QualType getAtomicType() const { return AtomicTy; }
133    QualType getValueType() const { return ValueTy; }
134    CharUnits getAtomicAlignment() const { return AtomicAlign; }
135    CharUnits getValueAlignment() const { return ValueAlign; }
136    uint64_t getAtomicSizeInBits() const { return AtomicSizeInBits; }
137    uint64_t getValueSizeInBits() const { return ValueSizeInBits; }
138    TypeEvaluationKind getEvaluationKind() const { return EvaluationKind; }
139    bool shouldUseLibcall() const { return UseLibcall; }
140    const LValue &getAtomicLValue() const { return LVal; }
141    llvm::Value *getAtomicPointer() const {
142      if (LVal.isSimple())
143        return LVal.getPointer();
144      else if (LVal.isBitField())
145        return LVal.getBitFieldPointer();
146      else if (LVal.isVectorElt())
147        return LVal.getVectorPointer();
148      assert(LVal.isExtVectorElt());
149      return LVal.getExtVectorPointer();
150    }
151    Address getAtomicAddress() const {
152      return Address(getAtomicPointer(), getAtomicAlignment());
153    }
154
155    Address getAtomicAddressAsAtomicIntPointer() const {
156      return emitCastToAtomicIntPointer(getAtomicAddress());
157    }
158
159    /// Is the atomic size larger than the underlying value type?
160    ///
161    /// Note that the absence of padding does not mean that atomic
162    /// objects are completely interchangeable with non-atomic
163    /// objects: we might have promoted the alignment of a type
164    /// without making it bigger.
165    bool hasPadding() const {
166      return (ValueSizeInBits != AtomicSizeInBits);
167    }
168
169    bool emitMemSetZeroIfNecessary() const;
170
171    llvm::Value *getAtomicSizeValue() const {
172      CharUnits size = CGF.getContext().toCharUnitsFromBits(AtomicSizeInBits);
173      return CGF.CGM.getSize(size);
174    }
175
176    /// Cast the given pointer to an integer pointer suitable for atomic
177    /// operations if the source.
178    Address emitCastToAtomicIntPointer(Address Addr) const;
179
180    /// If Addr is compatible with the iN that will be used for an atomic
181    /// operation, bitcast it. Otherwise, create a temporary that is suitable
182    /// and copy the value across.
183    Address convertToAtomicIntPointer(Address Addr) const;
184
185    /// Turn an atomic-layout object into an r-value.
186    RValue convertAtomicTempToRValue(Address addr, AggValueSlot resultSlot,
187                                     SourceLocation loc, bool AsValue) const;
188
189    /// \brief Converts a rvalue to integer value.
190    llvm::Value *convertRValueToInt(RValue RVal) const;
191
192    RValue ConvertIntToValueOrAtomic(llvm::Value *IntVal,
193                                     AggValueSlot ResultSlot,
194                                     SourceLocation Loc, bool AsValue) const;
195
196    /// Copy an atomic r-value into atomic-layout memory.
197    void emitCopyIntoMemory(RValue rvalue) const;
198
199    /// Project an l-value down to the value field.
200    LValue projectValue() const {
201      assert(LVal.isSimple());
202      Address addr = getAtomicAddress();
203      if (hasPadding())
204        addr = CGF.Builder.CreateStructGEP(addr, 0, CharUnits());
205
206      return LValue::MakeAddr(addr, getValueType(), CGF.getContext(),
207                              LVal.getAlignmentSource(), LVal.getTBAAInfo());
208    }
209
210    /// \brief Emits atomic load.
211    /// \returns Loaded value.
212    RValue EmitAtomicLoad(AggValueSlot ResultSlot, SourceLocation Loc,
213                          bool AsValue, llvm::AtomicOrdering AO,
214                          bool IsVolatile);
215
216    /// \brief Emits atomic compare-and-exchange sequence.
217    /// \param Expected Expected value.
218    /// \param Desired Desired value.
219    /// \param Success Atomic ordering for success operation.
220    /// \param Failure Atomic ordering for failed operation.
221    /// \param IsWeak true if atomic operation is weak, false otherwise.
222    /// \returns Pair of values: previous value from storage (value type) and
223    /// boolean flag (i1 type) with true if success and false otherwise.
224    std::pair<RValue, llvm::Value *> EmitAtomicCompareExchange(
225        RValue Expected, RValue Desired,
226        llvm::AtomicOrdering Success = llvm::SequentiallyConsistent,
227        llvm::AtomicOrdering Failure = llvm::SequentiallyConsistent,
228        bool IsWeak = false);
229
230    /// \brief Emits atomic update.
231    /// \param AO Atomic ordering.
232    /// \param UpdateOp Update operation for the current lvalue.
233    void EmitAtomicUpdate(llvm::AtomicOrdering AO,
234                          const llvm::function_ref<RValue(RValue)> &UpdateOp,
235                          bool IsVolatile);
236    /// \brief Emits atomic update.
237    /// \param AO Atomic ordering.
238    void EmitAtomicUpdate(llvm::AtomicOrdering AO, RValue UpdateRVal,
239                          bool IsVolatile);
240
241    /// Materialize an atomic r-value in atomic-layout memory.
242    Address materializeRValue(RValue rvalue) const;
243
244    /// \brief Translates LLVM atomic ordering to GNU atomic ordering for
245    /// libcalls.
246    static AtomicExpr::AtomicOrderingKind
247    translateAtomicOrdering(const llvm::AtomicOrdering AO);
248
249    /// \brief Creates temp alloca for intermediate operations on atomic value.
250    Address CreateTempAlloca() const;
251  private:
252    bool requiresMemSetZero(llvm::Type *type) const;
253
254
255    /// \brief Emits atomic load as a libcall.
256    void EmitAtomicLoadLibcall(llvm::Value *AddForLoaded,
257                               llvm::AtomicOrdering AO, bool IsVolatile);
258    /// \brief Emits atomic load as LLVM instruction.
259    llvm::Value *EmitAtomicLoadOp(llvm::AtomicOrdering AO, bool IsVolatile);
260    /// \brief Emits atomic compare-and-exchange op as a libcall.
261    llvm::Value *EmitAtomicCompareExchangeLibcall(
262        llvm::Value *ExpectedAddr, llvm::Value *DesiredAddr,
263        llvm::AtomicOrdering Success = llvm::SequentiallyConsistent,
264        llvm::AtomicOrdering Failure = llvm::SequentiallyConsistent);
265    /// \brief Emits atomic compare-and-exchange op as LLVM instruction.
266    std::pair<llvm::Value *, llvm::Value *> EmitAtomicCompareExchangeOp(
267        llvm::Value *ExpectedVal, llvm::Value *DesiredVal,
268        llvm::AtomicOrdering Success = llvm::SequentiallyConsistent,
269        llvm::AtomicOrdering Failure = llvm::SequentiallyConsistent,
270        bool IsWeak = false);
271    /// \brief Emit atomic update as libcalls.
272    void
273    EmitAtomicUpdateLibcall(llvm::AtomicOrdering AO,
274                            const llvm::function_ref<RValue(RValue)> &UpdateOp,
275                            bool IsVolatile);
276    /// \brief Emit atomic update as LLVM instructions.
277    void EmitAtomicUpdateOp(llvm::AtomicOrdering AO,
278                            const llvm::function_ref<RValue(RValue)> &UpdateOp,
279                            bool IsVolatile);
280    /// \brief Emit atomic update as libcalls.
281    void EmitAtomicUpdateLibcall(llvm::AtomicOrdering AO, RValue UpdateRVal,
282                                 bool IsVolatile);
283    /// \brief Emit atomic update as LLVM instructions.
284    void EmitAtomicUpdateOp(llvm::AtomicOrdering AO, RValue UpdateRal,
285                            bool IsVolatile);
286  };
287}
288
289AtomicExpr::AtomicOrderingKind
290AtomicInfo::translateAtomicOrdering(const llvm::AtomicOrdering AO) {
291  switch (AO) {
292  case llvm::Unordered:
293  case llvm::NotAtomic:
294  case llvm::Monotonic:
295    return AtomicExpr::AO_ABI_memory_order_relaxed;
296  case llvm::Acquire:
297    return AtomicExpr::AO_ABI_memory_order_acquire;
298  case llvm::Release:
299    return AtomicExpr::AO_ABI_memory_order_release;
300  case llvm::AcquireRelease:
301    return AtomicExpr::AO_ABI_memory_order_acq_rel;
302  case llvm::SequentiallyConsistent:
303    return AtomicExpr::AO_ABI_memory_order_seq_cst;
304  }
305  llvm_unreachable("Unhandled AtomicOrdering");
306}
307
308Address AtomicInfo::CreateTempAlloca() const {
309  Address TempAlloca = CGF.CreateMemTemp(
310      (LVal.isBitField() && ValueSizeInBits > AtomicSizeInBits) ? ValueTy
311                                                                : AtomicTy,
312      getAtomicAlignment(),
313      "atomic-temp");
314  // Cast to pointer to value type for bitfields.
315  if (LVal.isBitField())
316    return CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
317        TempAlloca, getAtomicAddress().getType());
318  return TempAlloca;
319}
320
321static RValue emitAtomicLibcall(CodeGenFunction &CGF,
322                                StringRef fnName,
323                                QualType resultType,
324                                CallArgList &args) {
325  const CGFunctionInfo &fnInfo =
326    CGF.CGM.getTypes().arrangeFreeFunctionCall(resultType, args,
327            FunctionType::ExtInfo(), RequiredArgs::All);
328  llvm::FunctionType *fnTy = CGF.CGM.getTypes().GetFunctionType(fnInfo);
329  llvm::Constant *fn = CGF.CGM.CreateRuntimeFunction(fnTy, fnName);
330  return CGF.EmitCall(fnInfo, fn, ReturnValueSlot(), args);
331}
332
333/// Does a store of the given IR type modify the full expected width?
334static bool isFullSizeType(CodeGenModule &CGM, llvm::Type *type,
335                           uint64_t expectedSize) {
336  return (CGM.getDataLayout().getTypeStoreSize(type) * 8 == expectedSize);
337}
338
339/// Does the atomic type require memsetting to zero before initialization?
340///
341/// The IR type is provided as a way of making certain queries faster.
342bool AtomicInfo::requiresMemSetZero(llvm::Type *type) const {
343  // If the atomic type has size padding, we definitely need a memset.
344  if (hasPadding()) return true;
345
346  // Otherwise, do some simple heuristics to try to avoid it:
347  switch (getEvaluationKind()) {
348  // For scalars and complexes, check whether the store size of the
349  // type uses the full size.
350  case TEK_Scalar:
351    return !isFullSizeType(CGF.CGM, type, AtomicSizeInBits);
352  case TEK_Complex:
353    return !isFullSizeType(CGF.CGM, type->getStructElementType(0),
354                           AtomicSizeInBits / 2);
355
356  // Padding in structs has an undefined bit pattern.  User beware.
357  case TEK_Aggregate:
358    return false;
359  }
360  llvm_unreachable("bad evaluation kind");
361}
362
363bool AtomicInfo::emitMemSetZeroIfNecessary() const {
364  assert(LVal.isSimple());
365  llvm::Value *addr = LVal.getPointer();
366  if (!requiresMemSetZero(addr->getType()->getPointerElementType()))
367    return false;
368
369  CGF.Builder.CreateMemSet(
370      addr, llvm::ConstantInt::get(CGF.Int8Ty, 0),
371      CGF.getContext().toCharUnitsFromBits(AtomicSizeInBits).getQuantity(),
372      LVal.getAlignment().getQuantity());
373  return true;
374}
375
376static void emitAtomicCmpXchg(CodeGenFunction &CGF, AtomicExpr *E, bool IsWeak,
377                              Address Dest, Address Ptr,
378                              Address Val1, Address Val2,
379                              uint64_t Size,
380                              llvm::AtomicOrdering SuccessOrder,
381                              llvm::AtomicOrdering FailureOrder) {
382  // Note that cmpxchg doesn't support weak cmpxchg, at least at the moment.
383  llvm::Value *Expected = CGF.Builder.CreateLoad(Val1);
384  llvm::Value *Desired = CGF.Builder.CreateLoad(Val2);
385
386  llvm::AtomicCmpXchgInst *Pair = CGF.Builder.CreateAtomicCmpXchg(
387      Ptr.getPointer(), Expected, Desired, SuccessOrder, FailureOrder);
388  Pair->setVolatile(E->isVolatile());
389  Pair->setWeak(IsWeak);
390
391  // Cmp holds the result of the compare-exchange operation: true on success,
392  // false on failure.
393  llvm::Value *Old = CGF.Builder.CreateExtractValue(Pair, 0);
394  llvm::Value *Cmp = CGF.Builder.CreateExtractValue(Pair, 1);
395
396  // This basic block is used to hold the store instruction if the operation
397  // failed.
398  llvm::BasicBlock *StoreExpectedBB =
399      CGF.createBasicBlock("cmpxchg.store_expected", CGF.CurFn);
400
401  // This basic block is the exit point of the operation, we should end up
402  // here regardless of whether or not the operation succeeded.
403  llvm::BasicBlock *ContinueBB =
404      CGF.createBasicBlock("cmpxchg.continue", CGF.CurFn);
405
406  // Update Expected if Expected isn't equal to Old, otherwise branch to the
407  // exit point.
408  CGF.Builder.CreateCondBr(Cmp, ContinueBB, StoreExpectedBB);
409
410  CGF.Builder.SetInsertPoint(StoreExpectedBB);
411  // Update the memory at Expected with Old's value.
412  CGF.Builder.CreateStore(Old, Val1);
413  // Finally, branch to the exit point.
414  CGF.Builder.CreateBr(ContinueBB);
415
416  CGF.Builder.SetInsertPoint(ContinueBB);
417  // Update the memory at Dest with Cmp's value.
418  CGF.EmitStoreOfScalar(Cmp, CGF.MakeAddrLValue(Dest, E->getType()));
419}
420
421/// Given an ordering required on success, emit all possible cmpxchg
422/// instructions to cope with the provided (but possibly only dynamically known)
423/// FailureOrder.
424static void emitAtomicCmpXchgFailureSet(CodeGenFunction &CGF, AtomicExpr *E,
425                                        bool IsWeak, Address Dest,
426                                        Address Ptr, Address Val1,
427                                        Address Val2,
428                                        llvm::Value *FailureOrderVal,
429                                        uint64_t Size,
430                                        llvm::AtomicOrdering SuccessOrder) {
431  llvm::AtomicOrdering FailureOrder;
432  if (llvm::ConstantInt *FO = dyn_cast<llvm::ConstantInt>(FailureOrderVal)) {
433    switch (FO->getSExtValue()) {
434    default:
435      FailureOrder = llvm::Monotonic;
436      break;
437    case AtomicExpr::AO_ABI_memory_order_consume:
438    case AtomicExpr::AO_ABI_memory_order_acquire:
439      FailureOrder = llvm::Acquire;
440      break;
441    case AtomicExpr::AO_ABI_memory_order_seq_cst:
442      FailureOrder = llvm::SequentiallyConsistent;
443      break;
444    }
445    if (FailureOrder >= SuccessOrder) {
446      // Don't assert on undefined behaviour.
447      FailureOrder =
448        llvm::AtomicCmpXchgInst::getStrongestFailureOrdering(SuccessOrder);
449    }
450    emitAtomicCmpXchg(CGF, E, IsWeak, Dest, Ptr, Val1, Val2, Size,
451                      SuccessOrder, FailureOrder);
452    return;
453  }
454
455  // Create all the relevant BB's
456  llvm::BasicBlock *MonotonicBB = nullptr, *AcquireBB = nullptr,
457                   *SeqCstBB = nullptr;
458  MonotonicBB = CGF.createBasicBlock("monotonic_fail", CGF.CurFn);
459  if (SuccessOrder != llvm::Monotonic && SuccessOrder != llvm::Release)
460    AcquireBB = CGF.createBasicBlock("acquire_fail", CGF.CurFn);
461  if (SuccessOrder == llvm::SequentiallyConsistent)
462    SeqCstBB = CGF.createBasicBlock("seqcst_fail", CGF.CurFn);
463
464  llvm::BasicBlock *ContBB = CGF.createBasicBlock("atomic.continue", CGF.CurFn);
465
466  llvm::SwitchInst *SI = CGF.Builder.CreateSwitch(FailureOrderVal, MonotonicBB);
467
468  // Emit all the different atomics
469
470  // MonotonicBB is arbitrarily chosen as the default case; in practice, this
471  // doesn't matter unless someone is crazy enough to use something that
472  // doesn't fold to a constant for the ordering.
473  CGF.Builder.SetInsertPoint(MonotonicBB);
474  emitAtomicCmpXchg(CGF, E, IsWeak, Dest, Ptr, Val1, Val2,
475                    Size, SuccessOrder, llvm::Monotonic);
476  CGF.Builder.CreateBr(ContBB);
477
478  if (AcquireBB) {
479    CGF.Builder.SetInsertPoint(AcquireBB);
480    emitAtomicCmpXchg(CGF, E, IsWeak, Dest, Ptr, Val1, Val2,
481                      Size, SuccessOrder, llvm::Acquire);
482    CGF.Builder.CreateBr(ContBB);
483    SI->addCase(CGF.Builder.getInt32(AtomicExpr::AO_ABI_memory_order_consume),
484                AcquireBB);
485    SI->addCase(CGF.Builder.getInt32(AtomicExpr::AO_ABI_memory_order_acquire),
486                AcquireBB);
487  }
488  if (SeqCstBB) {
489    CGF.Builder.SetInsertPoint(SeqCstBB);
490    emitAtomicCmpXchg(CGF, E, IsWeak, Dest, Ptr, Val1, Val2,
491                      Size, SuccessOrder, llvm::SequentiallyConsistent);
492    CGF.Builder.CreateBr(ContBB);
493    SI->addCase(CGF.Builder.getInt32(AtomicExpr::AO_ABI_memory_order_seq_cst),
494                SeqCstBB);
495  }
496
497  CGF.Builder.SetInsertPoint(ContBB);
498}
499
500static void EmitAtomicOp(CodeGenFunction &CGF, AtomicExpr *E, Address Dest,
501                         Address Ptr, Address Val1, Address Val2,
502                         llvm::Value *IsWeak, llvm::Value *FailureOrder,
503                         uint64_t Size, llvm::AtomicOrdering Order) {
504  llvm::AtomicRMWInst::BinOp Op = llvm::AtomicRMWInst::Add;
505  llvm::Instruction::BinaryOps PostOp = (llvm::Instruction::BinaryOps)0;
506
507  switch (E->getOp()) {
508  case AtomicExpr::AO__c11_atomic_init:
509    llvm_unreachable("Already handled!");
510
511  case AtomicExpr::AO__c11_atomic_compare_exchange_strong:
512    emitAtomicCmpXchgFailureSet(CGF, E, false, Dest, Ptr, Val1, Val2,
513                                FailureOrder, Size, Order);
514    return;
515  case AtomicExpr::AO__c11_atomic_compare_exchange_weak:
516    emitAtomicCmpXchgFailureSet(CGF, E, true, Dest, Ptr, Val1, Val2,
517                                FailureOrder, Size, Order);
518    return;
519  case AtomicExpr::AO__atomic_compare_exchange:
520  case AtomicExpr::AO__atomic_compare_exchange_n: {
521    if (llvm::ConstantInt *IsWeakC = dyn_cast<llvm::ConstantInt>(IsWeak)) {
522      emitAtomicCmpXchgFailureSet(CGF, E, IsWeakC->getZExtValue(), Dest, Ptr,
523                                  Val1, Val2, FailureOrder, Size, Order);
524    } else {
525      // Create all the relevant BB's
526      llvm::BasicBlock *StrongBB =
527          CGF.createBasicBlock("cmpxchg.strong", CGF.CurFn);
528      llvm::BasicBlock *WeakBB = CGF.createBasicBlock("cmxchg.weak", CGF.CurFn);
529      llvm::BasicBlock *ContBB =
530          CGF.createBasicBlock("cmpxchg.continue", CGF.CurFn);
531
532      llvm::SwitchInst *SI = CGF.Builder.CreateSwitch(IsWeak, WeakBB);
533      SI->addCase(CGF.Builder.getInt1(false), StrongBB);
534
535      CGF.Builder.SetInsertPoint(StrongBB);
536      emitAtomicCmpXchgFailureSet(CGF, E, false, Dest, Ptr, Val1, Val2,
537                                  FailureOrder, Size, Order);
538      CGF.Builder.CreateBr(ContBB);
539
540      CGF.Builder.SetInsertPoint(WeakBB);
541      emitAtomicCmpXchgFailureSet(CGF, E, true, Dest, Ptr, Val1, Val2,
542                                  FailureOrder, Size, Order);
543      CGF.Builder.CreateBr(ContBB);
544
545      CGF.Builder.SetInsertPoint(ContBB);
546    }
547    return;
548  }
549  case AtomicExpr::AO__c11_atomic_load:
550  case AtomicExpr::AO__atomic_load_n:
551  case AtomicExpr::AO__atomic_load: {
552    llvm::LoadInst *Load = CGF.Builder.CreateLoad(Ptr);
553    Load->setAtomic(Order);
554    Load->setVolatile(E->isVolatile());
555    CGF.Builder.CreateStore(Load, Dest);
556    return;
557  }
558
559  case AtomicExpr::AO__c11_atomic_store:
560  case AtomicExpr::AO__atomic_store:
561  case AtomicExpr::AO__atomic_store_n: {
562    llvm::Value *LoadVal1 = CGF.Builder.CreateLoad(Val1);
563    llvm::StoreInst *Store = CGF.Builder.CreateStore(LoadVal1, Ptr);
564    Store->setAtomic(Order);
565    Store->setVolatile(E->isVolatile());
566    return;
567  }
568
569  case AtomicExpr::AO__c11_atomic_exchange:
570  case AtomicExpr::AO__atomic_exchange_n:
571  case AtomicExpr::AO__atomic_exchange:
572    Op = llvm::AtomicRMWInst::Xchg;
573    break;
574
575  case AtomicExpr::AO__atomic_add_fetch:
576    PostOp = llvm::Instruction::Add;
577    // Fall through.
578  case AtomicExpr::AO__c11_atomic_fetch_add:
579  case AtomicExpr::AO__atomic_fetch_add:
580    Op = llvm::AtomicRMWInst::Add;
581    break;
582
583  case AtomicExpr::AO__atomic_sub_fetch:
584    PostOp = llvm::Instruction::Sub;
585    // Fall through.
586  case AtomicExpr::AO__c11_atomic_fetch_sub:
587  case AtomicExpr::AO__atomic_fetch_sub:
588    Op = llvm::AtomicRMWInst::Sub;
589    break;
590
591  case AtomicExpr::AO__atomic_and_fetch:
592    PostOp = llvm::Instruction::And;
593    // Fall through.
594  case AtomicExpr::AO__c11_atomic_fetch_and:
595  case AtomicExpr::AO__atomic_fetch_and:
596    Op = llvm::AtomicRMWInst::And;
597    break;
598
599  case AtomicExpr::AO__atomic_or_fetch:
600    PostOp = llvm::Instruction::Or;
601    // Fall through.
602  case AtomicExpr::AO__c11_atomic_fetch_or:
603  case AtomicExpr::AO__atomic_fetch_or:
604    Op = llvm::AtomicRMWInst::Or;
605    break;
606
607  case AtomicExpr::AO__atomic_xor_fetch:
608    PostOp = llvm::Instruction::Xor;
609    // Fall through.
610  case AtomicExpr::AO__c11_atomic_fetch_xor:
611  case AtomicExpr::AO__atomic_fetch_xor:
612    Op = llvm::AtomicRMWInst::Xor;
613    break;
614
615  case AtomicExpr::AO__atomic_nand_fetch:
616    PostOp = llvm::Instruction::And; // the NOT is special cased below
617  // Fall through.
618  case AtomicExpr::AO__atomic_fetch_nand:
619    Op = llvm::AtomicRMWInst::Nand;
620    break;
621  }
622
623  llvm::Value *LoadVal1 = CGF.Builder.CreateLoad(Val1);
624  llvm::AtomicRMWInst *RMWI =
625      CGF.Builder.CreateAtomicRMW(Op, Ptr.getPointer(), LoadVal1, Order);
626  RMWI->setVolatile(E->isVolatile());
627
628  // For __atomic_*_fetch operations, perform the operation again to
629  // determine the value which was written.
630  llvm::Value *Result = RMWI;
631  if (PostOp)
632    Result = CGF.Builder.CreateBinOp(PostOp, RMWI, LoadVal1);
633  if (E->getOp() == AtomicExpr::AO__atomic_nand_fetch)
634    Result = CGF.Builder.CreateNot(Result);
635  CGF.Builder.CreateStore(Result, Dest);
636}
637
638// This function emits any expression (scalar, complex, or aggregate)
639// into a temporary alloca.
640static Address
641EmitValToTemp(CodeGenFunction &CGF, Expr *E) {
642  Address DeclPtr = CGF.CreateMemTemp(E->getType(), ".atomictmp");
643  CGF.EmitAnyExprToMem(E, DeclPtr, E->getType().getQualifiers(),
644                       /*Init*/ true);
645  return DeclPtr;
646}
647
648static void
649AddDirectArgument(CodeGenFunction &CGF, CallArgList &Args,
650                  bool UseOptimizedLibcall, llvm::Value *Val, QualType ValTy,
651                  SourceLocation Loc, CharUnits SizeInChars) {
652  if (UseOptimizedLibcall) {
653    // Load value and pass it to the function directly.
654    CharUnits Align = CGF.getContext().getTypeAlignInChars(ValTy);
655    int64_t SizeInBits = CGF.getContext().toBits(SizeInChars);
656    ValTy =
657        CGF.getContext().getIntTypeForBitwidth(SizeInBits, /*Signed=*/false);
658    llvm::Type *IPtrTy = llvm::IntegerType::get(CGF.getLLVMContext(),
659                                                SizeInBits)->getPointerTo();
660    Address Ptr = Address(CGF.Builder.CreateBitCast(Val, IPtrTy), Align);
661    Val = CGF.EmitLoadOfScalar(Ptr, false,
662                               CGF.getContext().getPointerType(ValTy),
663                               Loc);
664    // Coerce the value into an appropriately sized integer type.
665    Args.add(RValue::get(Val), ValTy);
666  } else {
667    // Non-optimized functions always take a reference.
668    Args.add(RValue::get(CGF.EmitCastToVoidPtr(Val)),
669                         CGF.getContext().VoidPtrTy);
670  }
671}
672
673RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
674  QualType AtomicTy = E->getPtr()->getType()->getPointeeType();
675  QualType MemTy = AtomicTy;
676  if (const AtomicType *AT = AtomicTy->getAs<AtomicType>())
677    MemTy = AT->getValueType();
678  CharUnits sizeChars, alignChars;
679  std::tie(sizeChars, alignChars) = getContext().getTypeInfoInChars(AtomicTy);
680  uint64_t Size = sizeChars.getQuantity();
681  unsigned MaxInlineWidthInBits = getTarget().getMaxAtomicInlineWidth();
682  bool UseLibcall = (sizeChars != alignChars ||
683                     getContext().toBits(sizeChars) > MaxInlineWidthInBits);
684
685  llvm::Value *IsWeak = nullptr, *OrderFail = nullptr;
686
687  Address Val1 = Address::invalid();
688  Address Val2 = Address::invalid();
689  Address Dest = Address::invalid();
690  Address Ptr(EmitScalarExpr(E->getPtr()), alignChars);
691
692  if (E->getOp() == AtomicExpr::AO__c11_atomic_init) {
693    LValue lvalue = MakeAddrLValue(Ptr, AtomicTy);
694    EmitAtomicInit(E->getVal1(), lvalue);
695    return RValue::get(nullptr);
696  }
697
698  llvm::Value *Order = EmitScalarExpr(E->getOrder());
699
700  switch (E->getOp()) {
701  case AtomicExpr::AO__c11_atomic_init:
702    llvm_unreachable("Already handled above with EmitAtomicInit!");
703
704  case AtomicExpr::AO__c11_atomic_load:
705  case AtomicExpr::AO__atomic_load_n:
706    break;
707
708  case AtomicExpr::AO__atomic_load:
709    Dest = EmitPointerWithAlignment(E->getVal1());
710    break;
711
712  case AtomicExpr::AO__atomic_store:
713    Val1 = EmitPointerWithAlignment(E->getVal1());
714    break;
715
716  case AtomicExpr::AO__atomic_exchange:
717    Val1 = EmitPointerWithAlignment(E->getVal1());
718    Dest = EmitPointerWithAlignment(E->getVal2());
719    break;
720
721  case AtomicExpr::AO__c11_atomic_compare_exchange_strong:
722  case AtomicExpr::AO__c11_atomic_compare_exchange_weak:
723  case AtomicExpr::AO__atomic_compare_exchange_n:
724  case AtomicExpr::AO__atomic_compare_exchange:
725    Val1 = EmitPointerWithAlignment(E->getVal1());
726    if (E->getOp() == AtomicExpr::AO__atomic_compare_exchange)
727      Val2 = EmitPointerWithAlignment(E->getVal2());
728    else
729      Val2 = EmitValToTemp(*this, E->getVal2());
730    OrderFail = EmitScalarExpr(E->getOrderFail());
731    if (E->getNumSubExprs() == 6)
732      IsWeak = EmitScalarExpr(E->getWeak());
733    break;
734
735  case AtomicExpr::AO__c11_atomic_fetch_add:
736  case AtomicExpr::AO__c11_atomic_fetch_sub:
737    if (MemTy->isPointerType()) {
738      // For pointer arithmetic, we're required to do a bit of math:
739      // adding 1 to an int* is not the same as adding 1 to a uintptr_t.
740      // ... but only for the C11 builtins. The GNU builtins expect the
741      // user to multiply by sizeof(T).
742      QualType Val1Ty = E->getVal1()->getType();
743      llvm::Value *Val1Scalar = EmitScalarExpr(E->getVal1());
744      CharUnits PointeeIncAmt =
745          getContext().getTypeSizeInChars(MemTy->getPointeeType());
746      Val1Scalar = Builder.CreateMul(Val1Scalar, CGM.getSize(PointeeIncAmt));
747      auto Temp = CreateMemTemp(Val1Ty, ".atomictmp");
748      Val1 = Temp;
749      EmitStoreOfScalar(Val1Scalar, MakeAddrLValue(Temp, Val1Ty));
750      break;
751    }
752    // Fall through.
753  case AtomicExpr::AO__atomic_fetch_add:
754  case AtomicExpr::AO__atomic_fetch_sub:
755  case AtomicExpr::AO__atomic_add_fetch:
756  case AtomicExpr::AO__atomic_sub_fetch:
757  case AtomicExpr::AO__c11_atomic_store:
758  case AtomicExpr::AO__c11_atomic_exchange:
759  case AtomicExpr::AO__atomic_store_n:
760  case AtomicExpr::AO__atomic_exchange_n:
761  case AtomicExpr::AO__c11_atomic_fetch_and:
762  case AtomicExpr::AO__c11_atomic_fetch_or:
763  case AtomicExpr::AO__c11_atomic_fetch_xor:
764  case AtomicExpr::AO__atomic_fetch_and:
765  case AtomicExpr::AO__atomic_fetch_or:
766  case AtomicExpr::AO__atomic_fetch_xor:
767  case AtomicExpr::AO__atomic_fetch_nand:
768  case AtomicExpr::AO__atomic_and_fetch:
769  case AtomicExpr::AO__atomic_or_fetch:
770  case AtomicExpr::AO__atomic_xor_fetch:
771  case AtomicExpr::AO__atomic_nand_fetch:
772    Val1 = EmitValToTemp(*this, E->getVal1());
773    break;
774  }
775
776  QualType RValTy = E->getType().getUnqualifiedType();
777
778  // The inlined atomics only function on iN types, where N is a power of 2. We
779  // need to make sure (via temporaries if necessary) that all incoming values
780  // are compatible.
781  LValue AtomicVal = MakeAddrLValue(Ptr, AtomicTy);
782  AtomicInfo Atomics(*this, AtomicVal);
783
784  Ptr = Atomics.emitCastToAtomicIntPointer(Ptr);
785  if (Val1.isValid()) Val1 = Atomics.convertToAtomicIntPointer(Val1);
786  if (Val2.isValid()) Val2 = Atomics.convertToAtomicIntPointer(Val2);
787  if (Dest.isValid())
788    Dest = Atomics.emitCastToAtomicIntPointer(Dest);
789  else if (E->isCmpXChg())
790    Dest = CreateMemTemp(RValTy, "cmpxchg.bool");
791  else if (!RValTy->isVoidType())
792    Dest = Atomics.emitCastToAtomicIntPointer(Atomics.CreateTempAlloca());
793
794  // Use a library call.  See: http://gcc.gnu.org/wiki/Atomic/GCCMM/LIbrary .
795  if (UseLibcall) {
796    bool UseOptimizedLibcall = false;
797    switch (E->getOp()) {
798    case AtomicExpr::AO__c11_atomic_init:
799      llvm_unreachable("Already handled above with EmitAtomicInit!");
800
801    case AtomicExpr::AO__c11_atomic_fetch_add:
802    case AtomicExpr::AO__atomic_fetch_add:
803    case AtomicExpr::AO__c11_atomic_fetch_and:
804    case AtomicExpr::AO__atomic_fetch_and:
805    case AtomicExpr::AO__c11_atomic_fetch_or:
806    case AtomicExpr::AO__atomic_fetch_or:
807    case AtomicExpr::AO__atomic_fetch_nand:
808    case AtomicExpr::AO__c11_atomic_fetch_sub:
809    case AtomicExpr::AO__atomic_fetch_sub:
810    case AtomicExpr::AO__c11_atomic_fetch_xor:
811    case AtomicExpr::AO__atomic_fetch_xor:
812    case AtomicExpr::AO__atomic_add_fetch:
813    case AtomicExpr::AO__atomic_and_fetch:
814    case AtomicExpr::AO__atomic_nand_fetch:
815    case AtomicExpr::AO__atomic_or_fetch:
816    case AtomicExpr::AO__atomic_sub_fetch:
817    case AtomicExpr::AO__atomic_xor_fetch:
818      // For these, only library calls for certain sizes exist.
819      UseOptimizedLibcall = true;
820      break;
821
822    case AtomicExpr::AO__c11_atomic_load:
823    case AtomicExpr::AO__c11_atomic_store:
824    case AtomicExpr::AO__c11_atomic_exchange:
825    case AtomicExpr::AO__c11_atomic_compare_exchange_weak:
826    case AtomicExpr::AO__c11_atomic_compare_exchange_strong:
827    case AtomicExpr::AO__atomic_load_n:
828    case AtomicExpr::AO__atomic_load:
829    case AtomicExpr::AO__atomic_store_n:
830    case AtomicExpr::AO__atomic_store:
831    case AtomicExpr::AO__atomic_exchange_n:
832    case AtomicExpr::AO__atomic_exchange:
833    case AtomicExpr::AO__atomic_compare_exchange_n:
834    case AtomicExpr::AO__atomic_compare_exchange:
835      // Only use optimized library calls for sizes for which they exist.
836      if (Size == 1 || Size == 2 || Size == 4 || Size == 8)
837        UseOptimizedLibcall = true;
838      break;
839    }
840
841    CallArgList Args;
842    if (!UseOptimizedLibcall) {
843      // For non-optimized library calls, the size is the first parameter
844      Args.add(RValue::get(llvm::ConstantInt::get(SizeTy, Size)),
845               getContext().getSizeType());
846    }
847    // Atomic address is the first or second parameter
848    Args.add(RValue::get(EmitCastToVoidPtr(Ptr.getPointer())),
849             getContext().VoidPtrTy);
850
851    std::string LibCallName;
852    QualType LoweredMemTy =
853      MemTy->isPointerType() ? getContext().getIntPtrType() : MemTy;
854    QualType RetTy;
855    bool HaveRetTy = false;
856    llvm::Instruction::BinaryOps PostOp = (llvm::Instruction::BinaryOps)0;
857    switch (E->getOp()) {
858    case AtomicExpr::AO__c11_atomic_init:
859      llvm_unreachable("Already handled!");
860
861    // There is only one libcall for compare an exchange, because there is no
862    // optimisation benefit possible from a libcall version of a weak compare
863    // and exchange.
864    // bool __atomic_compare_exchange(size_t size, void *mem, void *expected,
865    //                                void *desired, int success, int failure)
866    // bool __atomic_compare_exchange_N(T *mem, T *expected, T desired,
867    //                                  int success, int failure)
868    case AtomicExpr::AO__c11_atomic_compare_exchange_weak:
869    case AtomicExpr::AO__c11_atomic_compare_exchange_strong:
870    case AtomicExpr::AO__atomic_compare_exchange:
871    case AtomicExpr::AO__atomic_compare_exchange_n:
872      LibCallName = "__atomic_compare_exchange";
873      RetTy = getContext().BoolTy;
874      HaveRetTy = true;
875      Args.add(RValue::get(EmitCastToVoidPtr(Val1.getPointer())),
876               getContext().VoidPtrTy);
877      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val2.getPointer(),
878                        MemTy, E->getExprLoc(), sizeChars);
879      Args.add(RValue::get(Order), getContext().IntTy);
880      Order = OrderFail;
881      break;
882    // void __atomic_exchange(size_t size, void *mem, void *val, void *return,
883    //                        int order)
884    // T __atomic_exchange_N(T *mem, T val, int order)
885    case AtomicExpr::AO__c11_atomic_exchange:
886    case AtomicExpr::AO__atomic_exchange_n:
887    case AtomicExpr::AO__atomic_exchange:
888      LibCallName = "__atomic_exchange";
889      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1.getPointer(),
890                        MemTy, E->getExprLoc(), sizeChars);
891      break;
892    // void __atomic_store(size_t size, void *mem, void *val, int order)
893    // void __atomic_store_N(T *mem, T val, int order)
894    case AtomicExpr::AO__c11_atomic_store:
895    case AtomicExpr::AO__atomic_store:
896    case AtomicExpr::AO__atomic_store_n:
897      LibCallName = "__atomic_store";
898      RetTy = getContext().VoidTy;
899      HaveRetTy = true;
900      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1.getPointer(),
901                        MemTy, E->getExprLoc(), sizeChars);
902      break;
903    // void __atomic_load(size_t size, void *mem, void *return, int order)
904    // T __atomic_load_N(T *mem, int order)
905    case AtomicExpr::AO__c11_atomic_load:
906    case AtomicExpr::AO__atomic_load:
907    case AtomicExpr::AO__atomic_load_n:
908      LibCallName = "__atomic_load";
909      break;
910    // T __atomic_add_fetch_N(T *mem, T val, int order)
911    // T __atomic_fetch_add_N(T *mem, T val, int order)
912    case AtomicExpr::AO__atomic_add_fetch:
913      PostOp = llvm::Instruction::Add;
914    // Fall through.
915    case AtomicExpr::AO__c11_atomic_fetch_add:
916    case AtomicExpr::AO__atomic_fetch_add:
917      LibCallName = "__atomic_fetch_add";
918      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1.getPointer(),
919                        LoweredMemTy, E->getExprLoc(), sizeChars);
920      break;
921    // T __atomic_and_fetch_N(T *mem, T val, int order)
922    // T __atomic_fetch_and_N(T *mem, T val, int order)
923    case AtomicExpr::AO__atomic_and_fetch:
924      PostOp = llvm::Instruction::And;
925    // Fall through.
926    case AtomicExpr::AO__c11_atomic_fetch_and:
927    case AtomicExpr::AO__atomic_fetch_and:
928      LibCallName = "__atomic_fetch_and";
929      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1.getPointer(),
930                        MemTy, E->getExprLoc(), sizeChars);
931      break;
932    // T __atomic_or_fetch_N(T *mem, T val, int order)
933    // T __atomic_fetch_or_N(T *mem, T val, int order)
934    case AtomicExpr::AO__atomic_or_fetch:
935      PostOp = llvm::Instruction::Or;
936    // Fall through.
937    case AtomicExpr::AO__c11_atomic_fetch_or:
938    case AtomicExpr::AO__atomic_fetch_or:
939      LibCallName = "__atomic_fetch_or";
940      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1.getPointer(),
941                        MemTy, E->getExprLoc(), sizeChars);
942      break;
943    // T __atomic_sub_fetch_N(T *mem, T val, int order)
944    // T __atomic_fetch_sub_N(T *mem, T val, int order)
945    case AtomicExpr::AO__atomic_sub_fetch:
946      PostOp = llvm::Instruction::Sub;
947    // Fall through.
948    case AtomicExpr::AO__c11_atomic_fetch_sub:
949    case AtomicExpr::AO__atomic_fetch_sub:
950      LibCallName = "__atomic_fetch_sub";
951      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1.getPointer(),
952                        LoweredMemTy, E->getExprLoc(), sizeChars);
953      break;
954    // T __atomic_xor_fetch_N(T *mem, T val, int order)
955    // T __atomic_fetch_xor_N(T *mem, T val, int order)
956    case AtomicExpr::AO__atomic_xor_fetch:
957      PostOp = llvm::Instruction::Xor;
958    // Fall through.
959    case AtomicExpr::AO__c11_atomic_fetch_xor:
960    case AtomicExpr::AO__atomic_fetch_xor:
961      LibCallName = "__atomic_fetch_xor";
962      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1.getPointer(),
963                        MemTy, E->getExprLoc(), sizeChars);
964      break;
965    // T __atomic_nand_fetch_N(T *mem, T val, int order)
966    // T __atomic_fetch_nand_N(T *mem, T val, int order)
967    case AtomicExpr::AO__atomic_nand_fetch:
968      PostOp = llvm::Instruction::And; // the NOT is special cased below
969    // Fall through.
970    case AtomicExpr::AO__atomic_fetch_nand:
971      LibCallName = "__atomic_fetch_nand";
972      AddDirectArgument(*this, Args, UseOptimizedLibcall, Val1.getPointer(),
973                        MemTy, E->getExprLoc(), sizeChars);
974      break;
975    }
976
977    // Optimized functions have the size in their name.
978    if (UseOptimizedLibcall)
979      LibCallName += "_" + llvm::utostr(Size);
980    // By default, assume we return a value of the atomic type.
981    if (!HaveRetTy) {
982      if (UseOptimizedLibcall) {
983        // Value is returned directly.
984        // The function returns an appropriately sized integer type.
985        RetTy = getContext().getIntTypeForBitwidth(
986            getContext().toBits(sizeChars), /*Signed=*/false);
987      } else {
988        // Value is returned through parameter before the order.
989        RetTy = getContext().VoidTy;
990        Args.add(RValue::get(EmitCastToVoidPtr(Dest.getPointer())),
991                 getContext().VoidPtrTy);
992      }
993    }
994    // order is always the last parameter
995    Args.add(RValue::get(Order),
996             getContext().IntTy);
997
998    // PostOp is only needed for the atomic_*_fetch operations, and
999    // thus is only needed for and implemented in the
1000    // UseOptimizedLibcall codepath.
1001    assert(UseOptimizedLibcall || !PostOp);
1002
1003    RValue Res = emitAtomicLibcall(*this, LibCallName, RetTy, Args);
1004    // The value is returned directly from the libcall.
1005    if (E->isCmpXChg())
1006      return Res;
1007
1008    // The value is returned directly for optimized libcalls but the expr
1009    // provided an out-param.
1010    if (UseOptimizedLibcall && Res.getScalarVal()) {
1011      llvm::Value *ResVal = Res.getScalarVal();
1012      if (PostOp) {
1013        llvm::Value *LoadVal1 = Args[1].RV.getScalarVal();
1014        ResVal = Builder.CreateBinOp(PostOp, ResVal, LoadVal1);
1015      }
1016      if (E->getOp() == AtomicExpr::AO__atomic_nand_fetch)
1017        ResVal = Builder.CreateNot(ResVal);
1018
1019      Builder.CreateStore(
1020          ResVal,
1021          Builder.CreateBitCast(Dest, ResVal->getType()->getPointerTo()));
1022    }
1023
1024    if (RValTy->isVoidType())
1025      return RValue::get(nullptr);
1026
1027    return convertTempToRValue(
1028        Builder.CreateBitCast(Dest, ConvertTypeForMem(RValTy)->getPointerTo()),
1029        RValTy, E->getExprLoc());
1030  }
1031
1032  bool IsStore = E->getOp() == AtomicExpr::AO__c11_atomic_store ||
1033                 E->getOp() == AtomicExpr::AO__atomic_store ||
1034                 E->getOp() == AtomicExpr::AO__atomic_store_n;
1035  bool IsLoad = E->getOp() == AtomicExpr::AO__c11_atomic_load ||
1036                E->getOp() == AtomicExpr::AO__atomic_load ||
1037                E->getOp() == AtomicExpr::AO__atomic_load_n;
1038
1039  if (isa<llvm::ConstantInt>(Order)) {
1040    int ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
1041    switch (ord) {
1042    case AtomicExpr::AO_ABI_memory_order_relaxed:
1043      EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, IsWeak, OrderFail,
1044                   Size, llvm::Monotonic);
1045      break;
1046    case AtomicExpr::AO_ABI_memory_order_consume:
1047    case AtomicExpr::AO_ABI_memory_order_acquire:
1048      if (IsStore)
1049        break; // Avoid crashing on code with undefined behavior
1050      EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, IsWeak, OrderFail,
1051                   Size, llvm::Acquire);
1052      break;
1053    case AtomicExpr::AO_ABI_memory_order_release:
1054      if (IsLoad)
1055        break; // Avoid crashing on code with undefined behavior
1056      EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, IsWeak, OrderFail,
1057                   Size, llvm::Release);
1058      break;
1059    case AtomicExpr::AO_ABI_memory_order_acq_rel:
1060      if (IsLoad || IsStore)
1061        break; // Avoid crashing on code with undefined behavior
1062      EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, IsWeak, OrderFail,
1063                   Size, llvm::AcquireRelease);
1064      break;
1065    case AtomicExpr::AO_ABI_memory_order_seq_cst:
1066      EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, IsWeak, OrderFail,
1067                   Size, llvm::SequentiallyConsistent);
1068      break;
1069    default: // invalid order
1070      // We should not ever get here normally, but it's hard to
1071      // enforce that in general.
1072      break;
1073    }
1074    if (RValTy->isVoidType())
1075      return RValue::get(nullptr);
1076
1077    return convertTempToRValue(
1078        Builder.CreateBitCast(Dest, ConvertTypeForMem(RValTy)->getPointerTo()),
1079        RValTy, E->getExprLoc());
1080  }
1081
1082  // Long case, when Order isn't obviously constant.
1083
1084  // Create all the relevant BB's
1085  llvm::BasicBlock *MonotonicBB = nullptr, *AcquireBB = nullptr,
1086                   *ReleaseBB = nullptr, *AcqRelBB = nullptr,
1087                   *SeqCstBB = nullptr;
1088  MonotonicBB = createBasicBlock("monotonic", CurFn);
1089  if (!IsStore)
1090    AcquireBB = createBasicBlock("acquire", CurFn);
1091  if (!IsLoad)
1092    ReleaseBB = createBasicBlock("release", CurFn);
1093  if (!IsLoad && !IsStore)
1094    AcqRelBB = createBasicBlock("acqrel", CurFn);
1095  SeqCstBB = createBasicBlock("seqcst", CurFn);
1096  llvm::BasicBlock *ContBB = createBasicBlock("atomic.continue", CurFn);
1097
1098  // Create the switch for the split
1099  // MonotonicBB is arbitrarily chosen as the default case; in practice, this
1100  // doesn't matter unless someone is crazy enough to use something that
1101  // doesn't fold to a constant for the ordering.
1102  Order = Builder.CreateIntCast(Order, Builder.getInt32Ty(), false);
1103  llvm::SwitchInst *SI = Builder.CreateSwitch(Order, MonotonicBB);
1104
1105  // Emit all the different atomics
1106  Builder.SetInsertPoint(MonotonicBB);
1107  EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, IsWeak, OrderFail,
1108               Size, llvm::Monotonic);
1109  Builder.CreateBr(ContBB);
1110  if (!IsStore) {
1111    Builder.SetInsertPoint(AcquireBB);
1112    EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, IsWeak, OrderFail,
1113                 Size, llvm::Acquire);
1114    Builder.CreateBr(ContBB);
1115    SI->addCase(Builder.getInt32(AtomicExpr::AO_ABI_memory_order_consume),
1116                AcquireBB);
1117    SI->addCase(Builder.getInt32(AtomicExpr::AO_ABI_memory_order_acquire),
1118                AcquireBB);
1119  }
1120  if (!IsLoad) {
1121    Builder.SetInsertPoint(ReleaseBB);
1122    EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, IsWeak, OrderFail,
1123                 Size, llvm::Release);
1124    Builder.CreateBr(ContBB);
1125    SI->addCase(Builder.getInt32(AtomicExpr::AO_ABI_memory_order_release),
1126                ReleaseBB);
1127  }
1128  if (!IsLoad && !IsStore) {
1129    Builder.SetInsertPoint(AcqRelBB);
1130    EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, IsWeak, OrderFail,
1131                 Size, llvm::AcquireRelease);
1132    Builder.CreateBr(ContBB);
1133    SI->addCase(Builder.getInt32(AtomicExpr::AO_ABI_memory_order_acq_rel),
1134                AcqRelBB);
1135  }
1136  Builder.SetInsertPoint(SeqCstBB);
1137  EmitAtomicOp(*this, E, Dest, Ptr, Val1, Val2, IsWeak, OrderFail,
1138               Size, llvm::SequentiallyConsistent);
1139  Builder.CreateBr(ContBB);
1140  SI->addCase(Builder.getInt32(AtomicExpr::AO_ABI_memory_order_seq_cst),
1141              SeqCstBB);
1142
1143  // Cleanup and return
1144  Builder.SetInsertPoint(ContBB);
1145  if (RValTy->isVoidType())
1146    return RValue::get(nullptr);
1147
1148  assert(Atomics.getValueSizeInBits() <= Atomics.getAtomicSizeInBits());
1149  return convertTempToRValue(
1150      Builder.CreateBitCast(Dest, ConvertTypeForMem(RValTy)->getPointerTo()),
1151      RValTy, E->getExprLoc());
1152}
1153
1154Address AtomicInfo::emitCastToAtomicIntPointer(Address addr) const {
1155  unsigned addrspace =
1156    cast<llvm::PointerType>(addr.getPointer()->getType())->getAddressSpace();
1157  llvm::IntegerType *ty =
1158    llvm::IntegerType::get(CGF.getLLVMContext(), AtomicSizeInBits);
1159  return CGF.Builder.CreateBitCast(addr, ty->getPointerTo(addrspace));
1160}
1161
1162Address AtomicInfo::convertToAtomicIntPointer(Address Addr) const {
1163  llvm::Type *Ty = Addr.getElementType();
1164  uint64_t SourceSizeInBits = CGF.CGM.getDataLayout().getTypeSizeInBits(Ty);
1165  if (SourceSizeInBits != AtomicSizeInBits) {
1166    Address Tmp = CreateTempAlloca();
1167    CGF.Builder.CreateMemCpy(Tmp, Addr,
1168                             std::min(AtomicSizeInBits, SourceSizeInBits) / 8);
1169    Addr = Tmp;
1170  }
1171
1172  return emitCastToAtomicIntPointer(Addr);
1173}
1174
1175RValue AtomicInfo::convertAtomicTempToRValue(Address addr,
1176                                             AggValueSlot resultSlot,
1177                                             SourceLocation loc,
1178                                             bool asValue) const {
1179  if (LVal.isSimple()) {
1180    if (EvaluationKind == TEK_Aggregate)
1181      return resultSlot.asRValue();
1182
1183    // Drill into the padding structure if we have one.
1184    if (hasPadding())
1185      addr = CGF.Builder.CreateStructGEP(addr, 0, CharUnits());
1186
1187    // Otherwise, just convert the temporary to an r-value using the
1188    // normal conversion routine.
1189    return CGF.convertTempToRValue(addr, getValueType(), loc);
1190  }
1191  if (!asValue)
1192    // Get RValue from temp memory as atomic for non-simple lvalues
1193    return RValue::get(CGF.Builder.CreateLoad(addr));
1194  if (LVal.isBitField())
1195    return CGF.EmitLoadOfBitfieldLValue(
1196        LValue::MakeBitfield(addr, LVal.getBitFieldInfo(), LVal.getType(),
1197                             LVal.getAlignmentSource()));
1198  if (LVal.isVectorElt())
1199    return CGF.EmitLoadOfLValue(
1200        LValue::MakeVectorElt(addr, LVal.getVectorIdx(), LVal.getType(),
1201                              LVal.getAlignmentSource()), loc);
1202  assert(LVal.isExtVectorElt());
1203  return CGF.EmitLoadOfExtVectorElementLValue(LValue::MakeExtVectorElt(
1204      addr, LVal.getExtVectorElts(), LVal.getType(),
1205      LVal.getAlignmentSource()));
1206}
1207
1208RValue AtomicInfo::ConvertIntToValueOrAtomic(llvm::Value *IntVal,
1209                                             AggValueSlot ResultSlot,
1210                                             SourceLocation Loc,
1211                                             bool AsValue) const {
1212  // Try not to in some easy cases.
1213  assert(IntVal->getType()->isIntegerTy() && "Expected integer value");
1214  if (getEvaluationKind() == TEK_Scalar &&
1215      (((!LVal.isBitField() ||
1216         LVal.getBitFieldInfo().Size == ValueSizeInBits) &&
1217        !hasPadding()) ||
1218       !AsValue)) {
1219    auto *ValTy = AsValue
1220                      ? CGF.ConvertTypeForMem(ValueTy)
1221                      : getAtomicAddress().getType()->getPointerElementType();
1222    if (ValTy->isIntegerTy()) {
1223      assert(IntVal->getType() == ValTy && "Different integer types.");
1224      return RValue::get(CGF.EmitFromMemory(IntVal, ValueTy));
1225    } else if (ValTy->isPointerTy())
1226      return RValue::get(CGF.Builder.CreateIntToPtr(IntVal, ValTy));
1227    else if (llvm::CastInst::isBitCastable(IntVal->getType(), ValTy))
1228      return RValue::get(CGF.Builder.CreateBitCast(IntVal, ValTy));
1229  }
1230
1231  // Create a temporary.  This needs to be big enough to hold the
1232  // atomic integer.
1233  Address Temp = Address::invalid();
1234  bool TempIsVolatile = false;
1235  if (AsValue && getEvaluationKind() == TEK_Aggregate) {
1236    assert(!ResultSlot.isIgnored());
1237    Temp = ResultSlot.getAddress();
1238    TempIsVolatile = ResultSlot.isVolatile();
1239  } else {
1240    Temp = CreateTempAlloca();
1241  }
1242
1243  // Slam the integer into the temporary.
1244  Address CastTemp = emitCastToAtomicIntPointer(Temp);
1245  CGF.Builder.CreateStore(IntVal, CastTemp)
1246      ->setVolatile(TempIsVolatile);
1247
1248  return convertAtomicTempToRValue(Temp, ResultSlot, Loc, AsValue);
1249}
1250
1251void AtomicInfo::EmitAtomicLoadLibcall(llvm::Value *AddForLoaded,
1252                                       llvm::AtomicOrdering AO, bool) {
1253  // void __atomic_load(size_t size, void *mem, void *return, int order);
1254  CallArgList Args;
1255  Args.add(RValue::get(getAtomicSizeValue()), CGF.getContext().getSizeType());
1256  Args.add(RValue::get(CGF.EmitCastToVoidPtr(getAtomicPointer())),
1257           CGF.getContext().VoidPtrTy);
1258  Args.add(RValue::get(CGF.EmitCastToVoidPtr(AddForLoaded)),
1259           CGF.getContext().VoidPtrTy);
1260  Args.add(RValue::get(
1261               llvm::ConstantInt::get(CGF.IntTy, translateAtomicOrdering(AO))),
1262           CGF.getContext().IntTy);
1263  emitAtomicLibcall(CGF, "__atomic_load", CGF.getContext().VoidTy, Args);
1264}
1265
1266llvm::Value *AtomicInfo::EmitAtomicLoadOp(llvm::AtomicOrdering AO,
1267                                          bool IsVolatile) {
1268  // Okay, we're doing this natively.
1269  Address Addr = getAtomicAddressAsAtomicIntPointer();
1270  llvm::LoadInst *Load = CGF.Builder.CreateLoad(Addr, "atomic-load");
1271  Load->setAtomic(AO);
1272
1273  // Other decoration.
1274  if (IsVolatile)
1275    Load->setVolatile(true);
1276  if (LVal.getTBAAInfo())
1277    CGF.CGM.DecorateInstructionWithTBAA(Load, LVal.getTBAAInfo());
1278  return Load;
1279}
1280
1281/// An LValue is a candidate for having its loads and stores be made atomic if
1282/// we are operating under /volatile:ms *and* the LValue itself is volatile and
1283/// performing such an operation can be performed without a libcall.
1284bool CodeGenFunction::LValueIsSuitableForInlineAtomic(LValue LV) {
1285  if (!CGM.getCodeGenOpts().MSVolatile) return false;
1286  AtomicInfo AI(*this, LV);
1287  bool IsVolatile = LV.isVolatile() || hasVolatileMember(LV.getType());
1288  // An atomic is inline if we don't need to use a libcall.
1289  bool AtomicIsInline = !AI.shouldUseLibcall();
1290  return IsVolatile && AtomicIsInline;
1291}
1292
1293/// An type is a candidate for having its loads and stores be made atomic if
1294/// we are operating under /volatile:ms *and* we know the access is volatile and
1295/// performing such an operation can be performed without a libcall.
1296bool CodeGenFunction::typeIsSuitableForInlineAtomic(QualType Ty,
1297                                                    bool IsVolatile) const {
1298  // An atomic is inline if we don't need to use a libcall (e.g. it is builtin).
1299  bool AtomicIsInline = getContext().getTargetInfo().hasBuiltinAtomic(
1300      getContext().getTypeSize(Ty), getContext().getTypeAlign(Ty));
1301  return CGM.getCodeGenOpts().MSVolatile && IsVolatile && AtomicIsInline;
1302}
1303
1304RValue CodeGenFunction::EmitAtomicLoad(LValue LV, SourceLocation SL,
1305                                       AggValueSlot Slot) {
1306  llvm::AtomicOrdering AO;
1307  bool IsVolatile = LV.isVolatileQualified();
1308  if (LV.getType()->isAtomicType()) {
1309    AO = llvm::SequentiallyConsistent;
1310  } else {
1311    AO = llvm::Acquire;
1312    IsVolatile = true;
1313  }
1314  return EmitAtomicLoad(LV, SL, AO, IsVolatile, Slot);
1315}
1316
1317RValue AtomicInfo::EmitAtomicLoad(AggValueSlot ResultSlot, SourceLocation Loc,
1318                                  bool AsValue, llvm::AtomicOrdering AO,
1319                                  bool IsVolatile) {
1320  // Check whether we should use a library call.
1321  if (shouldUseLibcall()) {
1322    Address TempAddr = Address::invalid();
1323    if (LVal.isSimple() && !ResultSlot.isIgnored()) {
1324      assert(getEvaluationKind() == TEK_Aggregate);
1325      TempAddr = ResultSlot.getAddress();
1326    } else
1327      TempAddr = CreateTempAlloca();
1328
1329    EmitAtomicLoadLibcall(TempAddr.getPointer(), AO, IsVolatile);
1330
1331    // Okay, turn that back into the original value or whole atomic (for
1332    // non-simple lvalues) type.
1333    return convertAtomicTempToRValue(TempAddr, ResultSlot, Loc, AsValue);
1334  }
1335
1336  // Okay, we're doing this natively.
1337  auto *Load = EmitAtomicLoadOp(AO, IsVolatile);
1338
1339  // If we're ignoring an aggregate return, don't do anything.
1340  if (getEvaluationKind() == TEK_Aggregate && ResultSlot.isIgnored())
1341    return RValue::getAggregate(Address::invalid(), false);
1342
1343  // Okay, turn that back into the original value or atomic (for non-simple
1344  // lvalues) type.
1345  return ConvertIntToValueOrAtomic(Load, ResultSlot, Loc, AsValue);
1346}
1347
1348/// Emit a load from an l-value of atomic type.  Note that the r-value
1349/// we produce is an r-value of the atomic *value* type.
1350RValue CodeGenFunction::EmitAtomicLoad(LValue src, SourceLocation loc,
1351                                       llvm::AtomicOrdering AO, bool IsVolatile,
1352                                       AggValueSlot resultSlot) {
1353  AtomicInfo Atomics(*this, src);
1354  return Atomics.EmitAtomicLoad(resultSlot, loc, /*AsValue=*/true, AO,
1355                                IsVolatile);
1356}
1357
1358/// Copy an r-value into memory as part of storing to an atomic type.
1359/// This needs to create a bit-pattern suitable for atomic operations.
1360void AtomicInfo::emitCopyIntoMemory(RValue rvalue) const {
1361  assert(LVal.isSimple());
1362  // If we have an r-value, the rvalue should be of the atomic type,
1363  // which means that the caller is responsible for having zeroed
1364  // any padding.  Just do an aggregate copy of that type.
1365  if (rvalue.isAggregate()) {
1366    CGF.EmitAggregateCopy(getAtomicAddress(),
1367                          rvalue.getAggregateAddress(),
1368                          getAtomicType(),
1369                          (rvalue.isVolatileQualified()
1370                           || LVal.isVolatileQualified()));
1371    return;
1372  }
1373
1374  // Okay, otherwise we're copying stuff.
1375
1376  // Zero out the buffer if necessary.
1377  emitMemSetZeroIfNecessary();
1378
1379  // Drill past the padding if present.
1380  LValue TempLVal = projectValue();
1381
1382  // Okay, store the rvalue in.
1383  if (rvalue.isScalar()) {
1384    CGF.EmitStoreOfScalar(rvalue.getScalarVal(), TempLVal, /*init*/ true);
1385  } else {
1386    CGF.EmitStoreOfComplex(rvalue.getComplexVal(), TempLVal, /*init*/ true);
1387  }
1388}
1389
1390
1391/// Materialize an r-value into memory for the purposes of storing it
1392/// to an atomic type.
1393Address AtomicInfo::materializeRValue(RValue rvalue) const {
1394  // Aggregate r-values are already in memory, and EmitAtomicStore
1395  // requires them to be values of the atomic type.
1396  if (rvalue.isAggregate())
1397    return rvalue.getAggregateAddress();
1398
1399  // Otherwise, make a temporary and materialize into it.
1400  LValue TempLV = CGF.MakeAddrLValue(CreateTempAlloca(), getAtomicType());
1401  AtomicInfo Atomics(CGF, TempLV);
1402  Atomics.emitCopyIntoMemory(rvalue);
1403  return TempLV.getAddress();
1404}
1405
1406llvm::Value *AtomicInfo::convertRValueToInt(RValue RVal) const {
1407  // If we've got a scalar value of the right size, try to avoid going
1408  // through memory.
1409  if (RVal.isScalar() && (!hasPadding() || !LVal.isSimple())) {
1410    llvm::Value *Value = RVal.getScalarVal();
1411    if (isa<llvm::IntegerType>(Value->getType()))
1412      return CGF.EmitToMemory(Value, ValueTy);
1413    else {
1414      llvm::IntegerType *InputIntTy = llvm::IntegerType::get(
1415          CGF.getLLVMContext(),
1416          LVal.isSimple() ? getValueSizeInBits() : getAtomicSizeInBits());
1417      if (isa<llvm::PointerType>(Value->getType()))
1418        return CGF.Builder.CreatePtrToInt(Value, InputIntTy);
1419      else if (llvm::BitCastInst::isBitCastable(Value->getType(), InputIntTy))
1420        return CGF.Builder.CreateBitCast(Value, InputIntTy);
1421    }
1422  }
1423  // Otherwise, we need to go through memory.
1424  // Put the r-value in memory.
1425  Address Addr = materializeRValue(RVal);
1426
1427  // Cast the temporary to the atomic int type and pull a value out.
1428  Addr = emitCastToAtomicIntPointer(Addr);
1429  return CGF.Builder.CreateLoad(Addr);
1430}
1431
1432std::pair<llvm::Value *, llvm::Value *> AtomicInfo::EmitAtomicCompareExchangeOp(
1433    llvm::Value *ExpectedVal, llvm::Value *DesiredVal,
1434    llvm::AtomicOrdering Success, llvm::AtomicOrdering Failure, bool IsWeak) {
1435  // Do the atomic store.
1436  Address Addr = getAtomicAddressAsAtomicIntPointer();
1437  auto *Inst = CGF.Builder.CreateAtomicCmpXchg(Addr.getPointer(),
1438                                               ExpectedVal, DesiredVal,
1439                                               Success, Failure);
1440  // Other decoration.
1441  Inst->setVolatile(LVal.isVolatileQualified());
1442  Inst->setWeak(IsWeak);
1443
1444  // Okay, turn that back into the original value type.
1445  auto *PreviousVal = CGF.Builder.CreateExtractValue(Inst, /*Idxs=*/0);
1446  auto *SuccessFailureVal = CGF.Builder.CreateExtractValue(Inst, /*Idxs=*/1);
1447  return std::make_pair(PreviousVal, SuccessFailureVal);
1448}
1449
1450llvm::Value *
1451AtomicInfo::EmitAtomicCompareExchangeLibcall(llvm::Value *ExpectedAddr,
1452                                             llvm::Value *DesiredAddr,
1453                                             llvm::AtomicOrdering Success,
1454                                             llvm::AtomicOrdering Failure) {
1455  // bool __atomic_compare_exchange(size_t size, void *obj, void *expected,
1456  // void *desired, int success, int failure);
1457  CallArgList Args;
1458  Args.add(RValue::get(getAtomicSizeValue()), CGF.getContext().getSizeType());
1459  Args.add(RValue::get(CGF.EmitCastToVoidPtr(getAtomicPointer())),
1460           CGF.getContext().VoidPtrTy);
1461  Args.add(RValue::get(CGF.EmitCastToVoidPtr(ExpectedAddr)),
1462           CGF.getContext().VoidPtrTy);
1463  Args.add(RValue::get(CGF.EmitCastToVoidPtr(DesiredAddr)),
1464           CGF.getContext().VoidPtrTy);
1465  Args.add(RValue::get(llvm::ConstantInt::get(
1466               CGF.IntTy, translateAtomicOrdering(Success))),
1467           CGF.getContext().IntTy);
1468  Args.add(RValue::get(llvm::ConstantInt::get(
1469               CGF.IntTy, translateAtomicOrdering(Failure))),
1470           CGF.getContext().IntTy);
1471  auto SuccessFailureRVal = emitAtomicLibcall(CGF, "__atomic_compare_exchange",
1472                                              CGF.getContext().BoolTy, Args);
1473
1474  return SuccessFailureRVal.getScalarVal();
1475}
1476
1477std::pair<RValue, llvm::Value *> AtomicInfo::EmitAtomicCompareExchange(
1478    RValue Expected, RValue Desired, llvm::AtomicOrdering Success,
1479    llvm::AtomicOrdering Failure, bool IsWeak) {
1480  if (Failure >= Success)
1481    // Don't assert on undefined behavior.
1482    Failure = llvm::AtomicCmpXchgInst::getStrongestFailureOrdering(Success);
1483
1484  // Check whether we should use a library call.
1485  if (shouldUseLibcall()) {
1486    // Produce a source address.
1487    Address ExpectedAddr = materializeRValue(Expected);
1488    Address DesiredAddr = materializeRValue(Desired);
1489    auto *Res = EmitAtomicCompareExchangeLibcall(ExpectedAddr.getPointer(),
1490                                                 DesiredAddr.getPointer(),
1491                                                 Success, Failure);
1492    return std::make_pair(
1493        convertAtomicTempToRValue(ExpectedAddr, AggValueSlot::ignored(),
1494                                  SourceLocation(), /*AsValue=*/false),
1495        Res);
1496  }
1497
1498  // If we've got a scalar value of the right size, try to avoid going
1499  // through memory.
1500  auto *ExpectedVal = convertRValueToInt(Expected);
1501  auto *DesiredVal = convertRValueToInt(Desired);
1502  auto Res = EmitAtomicCompareExchangeOp(ExpectedVal, DesiredVal, Success,
1503                                         Failure, IsWeak);
1504  return std::make_pair(
1505      ConvertIntToValueOrAtomic(Res.first, AggValueSlot::ignored(),
1506                                SourceLocation(), /*AsValue=*/false),
1507      Res.second);
1508}
1509
1510static void
1511EmitAtomicUpdateValue(CodeGenFunction &CGF, AtomicInfo &Atomics, RValue OldRVal,
1512                      const llvm::function_ref<RValue(RValue)> &UpdateOp,
1513                      Address DesiredAddr) {
1514  RValue UpRVal;
1515  LValue AtomicLVal = Atomics.getAtomicLValue();
1516  LValue DesiredLVal;
1517  if (AtomicLVal.isSimple()) {
1518    UpRVal = OldRVal;
1519    DesiredLVal = CGF.MakeAddrLValue(DesiredAddr, AtomicLVal.getType());
1520  } else {
1521    // Build new lvalue for temp address
1522    Address Ptr = Atomics.materializeRValue(OldRVal);
1523    LValue UpdateLVal;
1524    if (AtomicLVal.isBitField()) {
1525      UpdateLVal =
1526          LValue::MakeBitfield(Ptr, AtomicLVal.getBitFieldInfo(),
1527                               AtomicLVal.getType(),
1528                               AtomicLVal.getAlignmentSource());
1529      DesiredLVal =
1530          LValue::MakeBitfield(DesiredAddr, AtomicLVal.getBitFieldInfo(),
1531                               AtomicLVal.getType(),
1532                               AtomicLVal.getAlignmentSource());
1533    } else if (AtomicLVal.isVectorElt()) {
1534      UpdateLVal = LValue::MakeVectorElt(Ptr, AtomicLVal.getVectorIdx(),
1535                                         AtomicLVal.getType(),
1536                                         AtomicLVal.getAlignmentSource());
1537      DesiredLVal = LValue::MakeVectorElt(
1538          DesiredAddr, AtomicLVal.getVectorIdx(), AtomicLVal.getType(),
1539          AtomicLVal.getAlignmentSource());
1540    } else {
1541      assert(AtomicLVal.isExtVectorElt());
1542      UpdateLVal = LValue::MakeExtVectorElt(Ptr, AtomicLVal.getExtVectorElts(),
1543                                            AtomicLVal.getType(),
1544                                            AtomicLVal.getAlignmentSource());
1545      DesiredLVal = LValue::MakeExtVectorElt(
1546          DesiredAddr, AtomicLVal.getExtVectorElts(), AtomicLVal.getType(),
1547          AtomicLVal.getAlignmentSource());
1548    }
1549    UpdateLVal.setTBAAInfo(AtomicLVal.getTBAAInfo());
1550    DesiredLVal.setTBAAInfo(AtomicLVal.getTBAAInfo());
1551    UpRVal = CGF.EmitLoadOfLValue(UpdateLVal, SourceLocation());
1552  }
1553  // Store new value in the corresponding memory area
1554  RValue NewRVal = UpdateOp(UpRVal);
1555  if (NewRVal.isScalar()) {
1556    CGF.EmitStoreThroughLValue(NewRVal, DesiredLVal);
1557  } else {
1558    assert(NewRVal.isComplex());
1559    CGF.EmitStoreOfComplex(NewRVal.getComplexVal(), DesiredLVal,
1560                           /*isInit=*/false);
1561  }
1562}
1563
1564void AtomicInfo::EmitAtomicUpdateLibcall(
1565    llvm::AtomicOrdering AO, const llvm::function_ref<RValue(RValue)> &UpdateOp,
1566    bool IsVolatile) {
1567  auto Failure = llvm::AtomicCmpXchgInst::getStrongestFailureOrdering(AO);
1568
1569  Address ExpectedAddr = CreateTempAlloca();
1570
1571  EmitAtomicLoadLibcall(ExpectedAddr.getPointer(), AO, IsVolatile);
1572  auto *ContBB = CGF.createBasicBlock("atomic_cont");
1573  auto *ExitBB = CGF.createBasicBlock("atomic_exit");
1574  CGF.EmitBlock(ContBB);
1575  Address DesiredAddr = CreateTempAlloca();
1576  if ((LVal.isBitField() && BFI.Size != ValueSizeInBits) ||
1577      requiresMemSetZero(getAtomicAddress().getElementType())) {
1578    auto *OldVal = CGF.Builder.CreateLoad(ExpectedAddr);
1579    CGF.Builder.CreateStore(OldVal, DesiredAddr);
1580  }
1581  auto OldRVal = convertAtomicTempToRValue(ExpectedAddr,
1582                                           AggValueSlot::ignored(),
1583                                           SourceLocation(), /*AsValue=*/false);
1584  EmitAtomicUpdateValue(CGF, *this, OldRVal, UpdateOp, DesiredAddr);
1585  auto *Res =
1586      EmitAtomicCompareExchangeLibcall(ExpectedAddr.getPointer(),
1587                                       DesiredAddr.getPointer(),
1588                                       AO, Failure);
1589  CGF.Builder.CreateCondBr(Res, ExitBB, ContBB);
1590  CGF.EmitBlock(ExitBB, /*IsFinished=*/true);
1591}
1592
1593void AtomicInfo::EmitAtomicUpdateOp(
1594    llvm::AtomicOrdering AO, const llvm::function_ref<RValue(RValue)> &UpdateOp,
1595    bool IsVolatile) {
1596  auto Failure = llvm::AtomicCmpXchgInst::getStrongestFailureOrdering(AO);
1597
1598  // Do the atomic load.
1599  auto *OldVal = EmitAtomicLoadOp(AO, IsVolatile);
1600  // For non-simple lvalues perform compare-and-swap procedure.
1601  auto *ContBB = CGF.createBasicBlock("atomic_cont");
1602  auto *ExitBB = CGF.createBasicBlock("atomic_exit");
1603  auto *CurBB = CGF.Builder.GetInsertBlock();
1604  CGF.EmitBlock(ContBB);
1605  llvm::PHINode *PHI = CGF.Builder.CreatePHI(OldVal->getType(),
1606                                             /*NumReservedValues=*/2);
1607  PHI->addIncoming(OldVal, CurBB);
1608  Address NewAtomicAddr = CreateTempAlloca();
1609  Address NewAtomicIntAddr = emitCastToAtomicIntPointer(NewAtomicAddr);
1610  if ((LVal.isBitField() && BFI.Size != ValueSizeInBits) ||
1611      requiresMemSetZero(getAtomicAddress().getElementType())) {
1612    CGF.Builder.CreateStore(PHI, NewAtomicIntAddr);
1613  }
1614  auto OldRVal = ConvertIntToValueOrAtomic(PHI, AggValueSlot::ignored(),
1615                                           SourceLocation(), /*AsValue=*/false);
1616  EmitAtomicUpdateValue(CGF, *this, OldRVal, UpdateOp, NewAtomicAddr);
1617  auto *DesiredVal = CGF.Builder.CreateLoad(NewAtomicIntAddr);
1618  // Try to write new value using cmpxchg operation
1619  auto Res = EmitAtomicCompareExchangeOp(PHI, DesiredVal, AO, Failure);
1620  PHI->addIncoming(Res.first, CGF.Builder.GetInsertBlock());
1621  CGF.Builder.CreateCondBr(Res.second, ExitBB, ContBB);
1622  CGF.EmitBlock(ExitBB, /*IsFinished=*/true);
1623}
1624
1625static void EmitAtomicUpdateValue(CodeGenFunction &CGF, AtomicInfo &Atomics,
1626                                  RValue UpdateRVal, Address DesiredAddr) {
1627  LValue AtomicLVal = Atomics.getAtomicLValue();
1628  LValue DesiredLVal;
1629  // Build new lvalue for temp address
1630  if (AtomicLVal.isBitField()) {
1631    DesiredLVal =
1632        LValue::MakeBitfield(DesiredAddr, AtomicLVal.getBitFieldInfo(),
1633                             AtomicLVal.getType(),
1634                             AtomicLVal.getAlignmentSource());
1635  } else if (AtomicLVal.isVectorElt()) {
1636    DesiredLVal =
1637        LValue::MakeVectorElt(DesiredAddr, AtomicLVal.getVectorIdx(),
1638                              AtomicLVal.getType(),
1639                              AtomicLVal.getAlignmentSource());
1640  } else {
1641    assert(AtomicLVal.isExtVectorElt());
1642    DesiredLVal = LValue::MakeExtVectorElt(
1643        DesiredAddr, AtomicLVal.getExtVectorElts(), AtomicLVal.getType(),
1644        AtomicLVal.getAlignmentSource());
1645  }
1646  DesiredLVal.setTBAAInfo(AtomicLVal.getTBAAInfo());
1647  // Store new value in the corresponding memory area
1648  assert(UpdateRVal.isScalar());
1649  CGF.EmitStoreThroughLValue(UpdateRVal, DesiredLVal);
1650}
1651
1652void AtomicInfo::EmitAtomicUpdateLibcall(llvm::AtomicOrdering AO,
1653                                         RValue UpdateRVal, bool IsVolatile) {
1654  auto Failure = llvm::AtomicCmpXchgInst::getStrongestFailureOrdering(AO);
1655
1656  Address ExpectedAddr = CreateTempAlloca();
1657
1658  EmitAtomicLoadLibcall(ExpectedAddr.getPointer(), AO, IsVolatile);
1659  auto *ContBB = CGF.createBasicBlock("atomic_cont");
1660  auto *ExitBB = CGF.createBasicBlock("atomic_exit");
1661  CGF.EmitBlock(ContBB);
1662  Address DesiredAddr = CreateTempAlloca();
1663  if ((LVal.isBitField() && BFI.Size != ValueSizeInBits) ||
1664      requiresMemSetZero(getAtomicAddress().getElementType())) {
1665    auto *OldVal = CGF.Builder.CreateLoad(ExpectedAddr);
1666    CGF.Builder.CreateStore(OldVal, DesiredAddr);
1667  }
1668  EmitAtomicUpdateValue(CGF, *this, UpdateRVal, DesiredAddr);
1669  auto *Res =
1670      EmitAtomicCompareExchangeLibcall(ExpectedAddr.getPointer(),
1671                                       DesiredAddr.getPointer(),
1672                                       AO, Failure);
1673  CGF.Builder.CreateCondBr(Res, ExitBB, ContBB);
1674  CGF.EmitBlock(ExitBB, /*IsFinished=*/true);
1675}
1676
1677void AtomicInfo::EmitAtomicUpdateOp(llvm::AtomicOrdering AO, RValue UpdateRVal,
1678                                    bool IsVolatile) {
1679  auto Failure = llvm::AtomicCmpXchgInst::getStrongestFailureOrdering(AO);
1680
1681  // Do the atomic load.
1682  auto *OldVal = EmitAtomicLoadOp(AO, IsVolatile);
1683  // For non-simple lvalues perform compare-and-swap procedure.
1684  auto *ContBB = CGF.createBasicBlock("atomic_cont");
1685  auto *ExitBB = CGF.createBasicBlock("atomic_exit");
1686  auto *CurBB = CGF.Builder.GetInsertBlock();
1687  CGF.EmitBlock(ContBB);
1688  llvm::PHINode *PHI = CGF.Builder.CreatePHI(OldVal->getType(),
1689                                             /*NumReservedValues=*/2);
1690  PHI->addIncoming(OldVal, CurBB);
1691  Address NewAtomicAddr = CreateTempAlloca();
1692  Address NewAtomicIntAddr = emitCastToAtomicIntPointer(NewAtomicAddr);
1693  if ((LVal.isBitField() && BFI.Size != ValueSizeInBits) ||
1694      requiresMemSetZero(getAtomicAddress().getElementType())) {
1695    CGF.Builder.CreateStore(PHI, NewAtomicIntAddr);
1696  }
1697  EmitAtomicUpdateValue(CGF, *this, UpdateRVal, NewAtomicAddr);
1698  auto *DesiredVal = CGF.Builder.CreateLoad(NewAtomicIntAddr);
1699  // Try to write new value using cmpxchg operation
1700  auto Res = EmitAtomicCompareExchangeOp(PHI, DesiredVal, AO, Failure);
1701  PHI->addIncoming(Res.first, CGF.Builder.GetInsertBlock());
1702  CGF.Builder.CreateCondBr(Res.second, ExitBB, ContBB);
1703  CGF.EmitBlock(ExitBB, /*IsFinished=*/true);
1704}
1705
1706void AtomicInfo::EmitAtomicUpdate(
1707    llvm::AtomicOrdering AO, const llvm::function_ref<RValue(RValue)> &UpdateOp,
1708    bool IsVolatile) {
1709  if (shouldUseLibcall()) {
1710    EmitAtomicUpdateLibcall(AO, UpdateOp, IsVolatile);
1711  } else {
1712    EmitAtomicUpdateOp(AO, UpdateOp, IsVolatile);
1713  }
1714}
1715
1716void AtomicInfo::EmitAtomicUpdate(llvm::AtomicOrdering AO, RValue UpdateRVal,
1717                                  bool IsVolatile) {
1718  if (shouldUseLibcall()) {
1719    EmitAtomicUpdateLibcall(AO, UpdateRVal, IsVolatile);
1720  } else {
1721    EmitAtomicUpdateOp(AO, UpdateRVal, IsVolatile);
1722  }
1723}
1724
1725void CodeGenFunction::EmitAtomicStore(RValue rvalue, LValue lvalue,
1726                                      bool isInit) {
1727  bool IsVolatile = lvalue.isVolatileQualified();
1728  llvm::AtomicOrdering AO;
1729  if (lvalue.getType()->isAtomicType()) {
1730    AO = llvm::SequentiallyConsistent;
1731  } else {
1732    AO = llvm::Release;
1733    IsVolatile = true;
1734  }
1735  return EmitAtomicStore(rvalue, lvalue, AO, IsVolatile, isInit);
1736}
1737
1738/// Emit a store to an l-value of atomic type.
1739///
1740/// Note that the r-value is expected to be an r-value *of the atomic
1741/// type*; this means that for aggregate r-values, it should include
1742/// storage for any padding that was necessary.
1743void CodeGenFunction::EmitAtomicStore(RValue rvalue, LValue dest,
1744                                      llvm::AtomicOrdering AO, bool IsVolatile,
1745                                      bool isInit) {
1746  // If this is an aggregate r-value, it should agree in type except
1747  // maybe for address-space qualification.
1748  assert(!rvalue.isAggregate() ||
1749         rvalue.getAggregateAddress().getElementType()
1750           == dest.getAddress().getElementType());
1751
1752  AtomicInfo atomics(*this, dest);
1753  LValue LVal = atomics.getAtomicLValue();
1754
1755  // If this is an initialization, just put the value there normally.
1756  if (LVal.isSimple()) {
1757    if (isInit) {
1758      atomics.emitCopyIntoMemory(rvalue);
1759      return;
1760    }
1761
1762    // Check whether we should use a library call.
1763    if (atomics.shouldUseLibcall()) {
1764      // Produce a source address.
1765      Address srcAddr = atomics.materializeRValue(rvalue);
1766
1767      // void __atomic_store(size_t size, void *mem, void *val, int order)
1768      CallArgList args;
1769      args.add(RValue::get(atomics.getAtomicSizeValue()),
1770               getContext().getSizeType());
1771      args.add(RValue::get(EmitCastToVoidPtr(atomics.getAtomicPointer())),
1772               getContext().VoidPtrTy);
1773      args.add(RValue::get(EmitCastToVoidPtr(srcAddr.getPointer())),
1774               getContext().VoidPtrTy);
1775      args.add(RValue::get(llvm::ConstantInt::get(
1776                   IntTy, AtomicInfo::translateAtomicOrdering(AO))),
1777               getContext().IntTy);
1778      emitAtomicLibcall(*this, "__atomic_store", getContext().VoidTy, args);
1779      return;
1780    }
1781
1782    // Okay, we're doing this natively.
1783    llvm::Value *intValue = atomics.convertRValueToInt(rvalue);
1784
1785    // Do the atomic store.
1786    Address addr =
1787        atomics.emitCastToAtomicIntPointer(atomics.getAtomicAddress());
1788    intValue = Builder.CreateIntCast(
1789        intValue, addr.getElementType(), /*isSigned=*/false);
1790    llvm::StoreInst *store = Builder.CreateStore(intValue, addr);
1791
1792    // Initializations don't need to be atomic.
1793    if (!isInit)
1794      store->setAtomic(AO);
1795
1796    // Other decoration.
1797    if (IsVolatile)
1798      store->setVolatile(true);
1799    if (dest.getTBAAInfo())
1800      CGM.DecorateInstructionWithTBAA(store, dest.getTBAAInfo());
1801    return;
1802  }
1803
1804  // Emit simple atomic update operation.
1805  atomics.EmitAtomicUpdate(AO, rvalue, IsVolatile);
1806}
1807
1808/// Emit a compare-and-exchange op for atomic type.
1809///
1810std::pair<RValue, llvm::Value *> CodeGenFunction::EmitAtomicCompareExchange(
1811    LValue Obj, RValue Expected, RValue Desired, SourceLocation Loc,
1812    llvm::AtomicOrdering Success, llvm::AtomicOrdering Failure, bool IsWeak,
1813    AggValueSlot Slot) {
1814  // If this is an aggregate r-value, it should agree in type except
1815  // maybe for address-space qualification.
1816  assert(!Expected.isAggregate() ||
1817         Expected.getAggregateAddress().getElementType() ==
1818             Obj.getAddress().getElementType());
1819  assert(!Desired.isAggregate() ||
1820         Desired.getAggregateAddress().getElementType() ==
1821             Obj.getAddress().getElementType());
1822  AtomicInfo Atomics(*this, Obj);
1823
1824  return Atomics.EmitAtomicCompareExchange(Expected, Desired, Success, Failure,
1825                                           IsWeak);
1826}
1827
1828void CodeGenFunction::EmitAtomicUpdate(
1829    LValue LVal, llvm::AtomicOrdering AO,
1830    const llvm::function_ref<RValue(RValue)> &UpdateOp, bool IsVolatile) {
1831  AtomicInfo Atomics(*this, LVal);
1832  Atomics.EmitAtomicUpdate(AO, UpdateOp, IsVolatile);
1833}
1834
1835void CodeGenFunction::EmitAtomicInit(Expr *init, LValue dest) {
1836  AtomicInfo atomics(*this, dest);
1837
1838  switch (atomics.getEvaluationKind()) {
1839  case TEK_Scalar: {
1840    llvm::Value *value = EmitScalarExpr(init);
1841    atomics.emitCopyIntoMemory(RValue::get(value));
1842    return;
1843  }
1844
1845  case TEK_Complex: {
1846    ComplexPairTy value = EmitComplexExpr(init);
1847    atomics.emitCopyIntoMemory(RValue::getComplex(value));
1848    return;
1849  }
1850
1851  case TEK_Aggregate: {
1852    // Fix up the destination if the initializer isn't an expression
1853    // of atomic type.
1854    bool Zeroed = false;
1855    if (!init->getType()->isAtomicType()) {
1856      Zeroed = atomics.emitMemSetZeroIfNecessary();
1857      dest = atomics.projectValue();
1858    }
1859
1860    // Evaluate the expression directly into the destination.
1861    AggValueSlot slot = AggValueSlot::forLValue(dest,
1862                                        AggValueSlot::IsNotDestructed,
1863                                        AggValueSlot::DoesNotNeedGCBarriers,
1864                                        AggValueSlot::IsNotAliased,
1865                                        Zeroed ? AggValueSlot::IsZeroed :
1866                                                 AggValueSlot::IsNotZeroed);
1867
1868    EmitAggExpr(init, slot);
1869    return;
1870  }
1871  }
1872  llvm_unreachable("bad evaluation kind");
1873}
1874