@@ -5167,13 +5167,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
5167
5167
5168
5168
Value *Order = EmitScalarExpr(E->getArg(0));
5169
5169
Value *Scope = EmitScalarExpr(E->getArg(1));
5170
- if (isa<llvm::ConstantInt>(Order) && isa<llvm::ConstantInt>(Scope)) {
5171
- int Ord = cast<llvm::ConstantInt>(Order)->getZExtValue();
5172
- int Scp = cast<llvm::ConstantInt>(Scope)->getZExtValue();
5173
- SyncScope SS = ScopeModel->isValid(Scp)
5174
- ? ScopeModel->map(Scp)
5170
+ if (auto Ord = dyn_cast<llvm::ConstantInt>(Order);
5171
+ auto Scp = dyn_cast<llvm::ConstantInt>(Scope)) {
5172
+ SyncScope SS = ScopeModel->isValid(Scp->getZExtValue())
5173
+ ? ScopeModel->map(Scp->getZExtValue())
5175
5174
: ScopeModel->map(ScopeModel->getFallBackValue());
5176
- switch (Ord) {
5175
+ switch (Ord->getZExtValue() ) {
5177
5176
case 0: // memory_order_relaxed
5178
5177
default: // invalid order
5179
5178
break;
@@ -5212,7 +5211,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
5212
5211
5213
5212
llvm::BasicBlock *ContBB = createBasicBlock("atomic.scope.continue", CurFn);
5214
5213
5215
- llvm::DenseMap<llvm::BasicBlock *, llvm::AtomicOrdering> OrderBBs;
5214
+ llvm::SmallVector<std::pair<llvm::BasicBlock *, llvm::AtomicOrdering>>
5215
+ OrderBBs;
5216
5216
if (auto Ord = dyn_cast<llvm::ConstantInt>(Order)) {
5217
5217
switch (Ord->getZExtValue()) {
5218
5218
case 0: // memory_order_relaxed
@@ -5221,18 +5221,20 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
5221
5221
return RValue::get(nullptr);
5222
5222
case 1: // memory_order_consume
5223
5223
case 2: // memory_order_acquire
5224
- OrderBBs[Builder.GetInsertBlock()] = llvm::AtomicOrdering::Acquire;
5224
+ OrderBBs.emplace_back(Builder.GetInsertBlock(),
5225
+ llvm::AtomicOrdering::Acquire);
5225
5226
break;
5226
5227
case 3: // memory_order_release
5227
- OrderBBs[Builder.GetInsertBlock()] = llvm::AtomicOrdering::Release;
5228
+ OrderBBs.emplace_back(Builder.GetInsertBlock(),
5229
+ llvm::AtomicOrdering::Release);
5228
5230
break;
5229
5231
case 4: // memory_order_acq_rel
5230
- OrderBBs[ Builder.GetInsertBlock()] =
5231
- llvm::AtomicOrdering::AcquireRelease;
5232
+ OrderBBs.emplace_back( Builder.GetInsertBlock(),
5233
+ llvm::AtomicOrdering::AcquireRelease) ;
5232
5234
break;
5233
5235
case 5: // memory_order_seq_cst
5234
- OrderBBs[ Builder.GetInsertBlock()] =
5235
- llvm::AtomicOrdering::SequentiallyConsistent;
5236
+ OrderBBs.emplace_back( Builder.GetInsertBlock(),
5237
+ llvm::AtomicOrdering::SequentiallyConsistent) ;
5236
5238
break;
5237
5239
}
5238
5240
} else {
@@ -5249,10 +5251,11 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
5249
5251
SI->addCase(Builder.getInt32(4), AcqRelBB);
5250
5252
SI->addCase(Builder.getInt32(5), SeqCstBB);
5251
5253
5252
- OrderBBs[AcquireBB] = llvm::AtomicOrdering::Acquire;
5253
- OrderBBs[ReleaseBB] = llvm::AtomicOrdering::Release;
5254
- OrderBBs[AcqRelBB] = llvm::AtomicOrdering::AcquireRelease;
5255
- OrderBBs[SeqCstBB] = llvm::AtomicOrdering::SequentiallyConsistent;
5254
+ OrderBBs.emplace_back(AcquireBB, llvm::AtomicOrdering::Acquire);
5255
+ OrderBBs.emplace_back(ReleaseBB, llvm::AtomicOrdering::Release);
5256
+ OrderBBs.emplace_back(AcqRelBB, llvm::AtomicOrdering::AcquireRelease);
5257
+ OrderBBs.emplace_back(SeqCstBB,
5258
+ llvm::AtomicOrdering::SequentiallyConsistent);
5256
5259
}
5257
5260
5258
5261
for (auto &[OrderBB, Ordering] : OrderBBs) {
0 commit comments