Skip to content

Commit 031ec80

Browse files
authored
[CodeGen] Fix volatile inst, to match MSVC code semantics on windows (#171862)
Fix #126516 Use AtomicOrdering::Monotonic's atomic loading to let the backend automatically select the appropriate instructions to match MSVC semantics.
1 parent 1ea201d commit 031ec80

File tree

2 files changed

+10
-8
lines changed

2 files changed

+10
-8
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,7 @@ static Value *EmitISOVolatileLoad(CodeGenFunction &CGF, const CallExpr *E) {
566566
llvm::Type *ITy =
567567
llvm::IntegerType::get(CGF.getLLVMContext(), LoadSize.getQuantity() * 8);
568568
llvm::LoadInst *Load = CGF.Builder.CreateAlignedLoad(ITy, Ptr, LoadSize);
569+
Load->setAtomic(llvm::AtomicOrdering::Monotonic);
569570
Load->setVolatile(true);
570571
return Load;
571572
}
@@ -578,6 +579,7 @@ static Value *EmitISOVolatileStore(CodeGenFunction &CGF, const CallExpr *E) {
578579
CharUnits StoreSize = CGF.getContext().getTypeSizeInChars(ElTy);
579580
llvm::StoreInst *Store =
580581
CGF.Builder.CreateAlignedStore(Value, Ptr, StoreSize);
582+
Store->setAtomic(llvm::AtomicOrdering::Monotonic);
581583
Store->setVolatile(true);
582584
return Store;
583585
}

clang/test/CodeGen/ms-intrinsics.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -592,27 +592,27 @@ int test_iso_volatile_load32(int volatile *p) { return __iso_volatile_load32(p);
592592
__int64 test_iso_volatile_load64(__int64 volatile *p) { return __iso_volatile_load64(p); }
593593

594594
// CHECK: define{{.*}}i8 @test_iso_volatile_load8(ptr{{.*}}%p)
595-
// CHECK: = load volatile i8, ptr %p
595+
// CHECK: = load atomic volatile i8, ptr %p monotonic
596596
// CHECK: define{{.*}}i16 @test_iso_volatile_load16(ptr{{.*}}%p)
597-
// CHECK: = load volatile i16, ptr %p
597+
// CHECK: = load atomic volatile i16, ptr %p monotonic
598598
// CHECK: define{{.*}}i32 @test_iso_volatile_load32(ptr{{.*}}%p)
599-
// CHECK: = load volatile i32, ptr %p
599+
// CHECK: = load atomic volatile i32, ptr %p monotonic
600600
// CHECK: define{{.*}}i64 @test_iso_volatile_load64(ptr{{.*}}%p)
601-
// CHECK: = load volatile i64, ptr %p
601+
// CHECK: = load atomic volatile i64, ptr %p monotonic
602602

603603
void test_iso_volatile_store8(char volatile *p, char v) { __iso_volatile_store8(p, v); }
604604
void test_iso_volatile_store16(short volatile *p, short v) { __iso_volatile_store16(p, v); }
605605
void test_iso_volatile_store32(int volatile *p, int v) { __iso_volatile_store32(p, v); }
606606
void test_iso_volatile_store64(__int64 volatile *p, __int64 v) { __iso_volatile_store64(p, v); }
607607

608608
// CHECK: define{{.*}}void @test_iso_volatile_store8(ptr{{.*}}%p, i8 {{[a-z_ ]*}}%v)
609-
// CHECK: store volatile i8 %v, ptr %p
609+
// CHECK: store atomic volatile i8 %v, ptr %p monotonic
610610
// CHECK: define{{.*}}void @test_iso_volatile_store16(ptr{{.*}}%p, i16 {{[a-z_ ]*}}%v)
611-
// CHECK: store volatile i16 %v, ptr %p
611+
// CHECK: store atomic volatile i16 %v, ptr %p monotonic
612612
// CHECK: define{{.*}}void @test_iso_volatile_store32(ptr{{.*}}%p, i32 {{[a-z_ ]*}}%v)
613-
// CHECK: store volatile i32 %v, ptr %p
613+
// CHECK: store atomic volatile i32 %v, ptr %p monotonic
614614
// CHECK: define{{.*}}void @test_iso_volatile_store64(ptr{{.*}}%p, i64 {{[a-z_ ]*}}%v)
615-
// CHECK: store volatile i64 %v, ptr %p
615+
// CHECK: store atomic volatile i64 %v, ptr %p monotonic
616616

617617

618618
#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__aarch64__)

0 commit comments

Comments
 (0)