Make -Watomic-alignment say whether the atomic operation was oversized

or misaligned.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@341710 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Richard Smith 2018-09-07 21:24:27 +00:00
parent d61a5cefe6
commit 52bc9ec102
3 changed files with 14 additions and 10 deletions

View File

@ -7093,8 +7093,8 @@ def warn_atomic_op_has_invalid_memory_order : Warning<
def err_atomic_op_has_invalid_synch_scope : Error<
"synchronization scope argument to atomic operation is invalid">;
def warn_atomic_op_misaligned : Warning<
"misaligned or large atomic operation may incur significant performance penalty">,
InGroup<DiagGroup<"atomic-alignment">>;
"%select{large|misaligned}0 atomic operation may incur "
"significant performance penalty">, InGroup<DiagGroup<"atomic-alignment">>;
def err_overflow_builtin_must_be_int : Error<
"operand argument to overflow builtin must be an integer (%0 invalid)">;

View File

@ -765,11 +765,15 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
std::tie(sizeChars, alignChars) = getContext().getTypeInfoInChars(AtomicTy);
uint64_t Size = sizeChars.getQuantity();
unsigned MaxInlineWidthInBits = getTarget().getMaxAtomicInlineWidth();
bool UseLibcall = ((Ptr.getAlignment() % sizeChars) != 0 ||
getContext().toBits(sizeChars) > MaxInlineWidthInBits);
if (UseLibcall)
CGM.getDiags().Report(E->getBeginLoc(), diag::warn_atomic_op_misaligned);
bool Oversized = getContext().toBits(sizeChars) > MaxInlineWidthInBits;
bool Misaligned = (Ptr.getAlignment() % sizeChars) != 0;
bool UseLibcall = Misaligned | Oversized;
if (UseLibcall) {
CGM.getDiags().Report(E->getBeginLoc(), diag::warn_atomic_op_misaligned)
<< !Oversized;
}
llvm::Value *Order = EmitScalarExpr(E->getOrder());
llvm::Value *Scope =

View File

@ -12,10 +12,10 @@ typedef int __attribute__((aligned(1))) unaligned_int;
void func(IntPair *p) {
IntPair res;
__atomic_load(p, &res, 0); // expected-warning {{misaligned or large atomic operation may incur significant performance penalty}}
__atomic_store(p, &res, 0); // expected-warning {{misaligned or large atomic operation may incur significant performance penalty}}
__atomic_fetch_add((unaligned_int *)p, 1, 2); // expected-warning {{misaligned or large atomic operation may incur significant performance penalty}}
__atomic_fetch_sub((unaligned_int *)p, 1, 3); // expected-warning {{misaligned or large atomic operation may incur significant performance penalty}}
__atomic_load(p, &res, 0); // expected-warning {{misaligned atomic operation may incur significant performance penalty}}
__atomic_store(p, &res, 0); // expected-warning {{misaligned atomic operation may incur significant performance penalty}}
__atomic_fetch_add((unaligned_int *)p, 1, 2); // expected-warning {{misaligned atomic operation may incur significant performance penalty}}
__atomic_fetch_sub((unaligned_int *)p, 1, 3); // expected-warning {{misaligned atomic operation may incur significant performance penalty}}
}
void func1(LongStruct *p) {