Skip to content

Commit 2fbe8d5

Browse files
committed
fix temporary not zeroed
1 parent 63252e0 commit 2fbe8d5

File tree

3 files changed

+12
-0
lines changed

3 files changed

+12
-0
lines changed

clang/lib/CodeGen/CGAtomic.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1433,6 +1433,11 @@ Address AtomicInfo::convertToAtomicIntPointer(Address Addr) const {
14331433
uint64_t SourceSizeInBits = CGF.CGM.getDataLayout().getTypeSizeInBits(Ty);
14341434
if (SourceSizeInBits != AtomicSizeInBits) {
14351435
Address Tmp = CreateTempAlloca();
1436+
CGF.Builder.CreateMemSet(
1437+
Tmp.emitRawPointer(CGF), llvm::ConstantInt::get(CGF.Int8Ty, 0),
1438+
CGF.getContext().toCharUnitsFromBits(AtomicSizeInBits).getQuantity(),
1439+
Tmp.getAlignment().getAsAlign());
1440+
14361441
CGF.Builder.CreateMemCpy(Tmp, Addr,
14371442
std::min(AtomicSizeInBits, SourceSizeInBits) / 8);
14381443
Addr = Tmp;

clang/test/CodeGenCXX/builtin-atomic-compare_exchange.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ struct S {
2525
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8
2626
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[EXPECTED_ADDR]], align 8
2727
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[DOTATOMICTMP]], ptr align 1 [[DESIRED]], i64 3, i1 false)
28+
// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[ATOMIC_TEMP]], i8 0, i64 4, i1 false)
2829
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ATOMIC_TEMP]], ptr align 1 [[TMP1]], i64 3, i1 false)
30+
// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[ATOMIC_TEMP1]], i8 0, i64 4, i1 false)
2931
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[ATOMIC_TEMP1]], ptr align 1 [[DOTATOMICTMP]], i64 3, i1 false)
3032
// CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[ATOMIC_TEMP]], align 4
3133
// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[ATOMIC_TEMP1]], align 4
@@ -102,7 +104,9 @@ bool test_compare_exchange(_Atomic(S<4>)* a, S<4>* expected, S<4> desired) {
102104
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8
103105
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[EXPECTED_ADDR]], align 8
104106
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[DOTATOMICTMP]], ptr align 1 [[DESIRED]], i64 6, i1 false)
107+
// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[ATOMIC_TEMP]], i8 0, i64 8, i1 false)
105108
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[ATOMIC_TEMP]], ptr align 1 [[TMP1]], i64 6, i1 false)
109+
// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[ATOMIC_TEMP1]], i8 0, i64 8, i1 false)
106110
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[ATOMIC_TEMP1]], ptr align 1 [[DOTATOMICTMP]], i64 6, i1 false)
107111
// CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr [[ATOMIC_TEMP]], align 8
108112
// CHECK-NEXT: [[TMP3:%.*]] = load i64, ptr [[ATOMIC_TEMP1]], align 8

libcxx/test/std/atomics/atomics.types.generic/30023.pass.cpp renamed to libcxx/test/std/atomics/atomics.types.generic/cas_non_power_of_2.pass.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
#include <cstring>
1717
#include <cassert>
1818

19+
// todo remove after debugging
20+
#include <iostream>
21+
1922
template <int Size>
2023
struct S {
2124
char data[Size];

0 commit comments

Comments
 (0)