@@ -5179,13 +5179,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
5179
5179
5180
5180
Value *Order = EmitScalarExpr(E->getArg(0));
5181
5181
Value *Scope = EmitScalarExpr(E->getArg(1));
5182
- if (isa<llvm::ConstantInt>(Order) && isa<llvm::ConstantInt>(Scope)) {
5183
- int Ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
5184
- int Scp = cast<llvm::ConstantInt>(Scope)->getZExtValue();
5185
- SyncScope SS = ScopeModel->isValid(Scp)
5186
- ? ScopeModel->map(Scp)
5182
+ if (auto Ord = dyn_cast<llvm::ConstantInt>(Order);
5183
+ auto Scp = dyn_cast<llvm::ConstantInt>(Scope)) {
5184
+ SyncScope SS = ScopeModel->isValid(Scp->getZExtValue())
5185
+ ? ScopeModel->map(Scp->getZExtValue())
5187
5186
: ScopeModel->map(ScopeModel->getFallBackValue());
5188
- switch (Ord) {
5187
+ switch (Ord->getZExtValue() ) {
5189
5188
case 0: // memory_order_relaxed
5190
5189
default: // invalid order
5191
5190
break;
@@ -5224,7 +5223,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
5224
5223
5225
5224
llvm::BasicBlock *ContBB = createBasicBlock("atomic.scope.continue", CurFn);
5226
5225
5227
- llvm::DenseMap<llvm::BasicBlock *, llvm::AtomicOrdering> OrderBBs;
5226
+ llvm::SmallVector<std::pair<llvm::BasicBlock *, llvm::AtomicOrdering>>
5227
+ OrderBBs;
5228
5228
if (auto Ord = dyn_cast<llvm::ConstantInt>(Order)) {
5229
5229
switch (Ord->getZExtValue()) {
5230
5230
case 0: // memory_order_relaxed
@@ -5233,18 +5233,20 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
5233
5233
return RValue::get(nullptr);
5234
5234
case 1: // memory_order_consume
5235
5235
case 2: // memory_order_acquire
5236
- OrderBBs[Builder.GetInsertBlock()] = llvm::AtomicOrdering::Acquire;
5236
+ OrderBBs.emplace_back(Builder.GetInsertBlock(),
5237
+ llvm::AtomicOrdering::Acquire);
5237
5238
break;
5238
5239
case 3: // memory_order_release
5239
- OrderBBs[Builder.GetInsertBlock()] = llvm::AtomicOrdering::Release;
5240
+ OrderBBs.emplace_back(Builder.GetInsertBlock(),
5241
+ llvm::AtomicOrdering::Release);
5240
5242
break;
5241
5243
case 4: // memory_order_acq_rel
5242
- OrderBBs[ Builder.GetInsertBlock()] =
5243
- llvm::AtomicOrdering::AcquireRelease;
5244
+ OrderBBs.emplace_back( Builder.GetInsertBlock(),
5245
+ llvm::AtomicOrdering::AcquireRelease) ;
5244
5246
break;
5245
5247
case 5: // memory_order_seq_cst
5246
- OrderBBs[ Builder.GetInsertBlock()] =
5247
- llvm::AtomicOrdering::SequentiallyConsistent;
5248
+ OrderBBs.emplace_back( Builder.GetInsertBlock(),
5249
+ llvm::AtomicOrdering::SequentiallyConsistent) ;
5248
5250
break;
5249
5251
}
5250
5252
} else {
@@ -5261,10 +5263,11 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
5261
5263
SI->addCase(Builder.getInt32(4), AcqRelBB);
5262
5264
SI->addCase(Builder.getInt32(5), SeqCstBB);
5263
5265
5264
- OrderBBs[AcquireBB] = llvm::AtomicOrdering::Acquire;
5265
- OrderBBs[ReleaseBB] = llvm::AtomicOrdering::Release;
5266
- OrderBBs[AcqRelBB] = llvm::AtomicOrdering::AcquireRelease;
5267
- OrderBBs[SeqCstBB] = llvm::AtomicOrdering::SequentiallyConsistent;
5266
+ OrderBBs.emplace_back(AcquireBB, llvm::AtomicOrdering::Acquire);
5267
+ OrderBBs.emplace_back(ReleaseBB, llvm::AtomicOrdering::Release);
5268
+ OrderBBs.emplace_back(AcqRelBB, llvm::AtomicOrdering::AcquireRelease);
5269
+ OrderBBs.emplace_back(SeqCstBB,
5270
+ llvm::AtomicOrdering::SequentiallyConsistent);
5268
5271
}
5269
5272
5270
5273
for (auto &[OrderBB, Ordering] : OrderBBs) {
0 commit comments