[llvm-dev] Unaligned atomic load/store
Dr. ERDI Gergo via llvm-dev
llvm-dev at lists.llvm.org
Sat Aug 26 05:31:30 PDT 2017
Hi,
While working on the AVR target, I noticed a problem with alignment and
the various atomic operations. AVR is an 8-bit platform, and all data is
unaligned (or 8-bit aligned if you will). Here's a small piece of LLVM IR
exhibiting this (emitted by the Rust compiler):
target datalayout = "e-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8"
target triple = "avr-unknown-unknown"
%"atomic::AtomicI16" = type { %"core::cell::UnsafeCell<i16>", [0 x i8] }
%"core::cell::UnsafeCell<i16>" = type { i16, [0 x i8] }
define void @foo(%"atomic::AtomicI16"*) {
start:
%_15 = alloca i16, align 1
%1 = getelementptr inbounds %"atomic::AtomicI16", %"atomic::AtomicI16"* %0, i16 0, i32 0, i32 0
%2 = load atomic i16, i16* %1 seq_cst, align 1
ret void
}
This trips up the following assertion in CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:
if (I.getAlignment() < VT.getSizeInBits() / 8)
report_fatal_error("Cannot generate unaligned atomic load");
I've tried commenting out the check and llc finishes, generating
not-obviously-wrong machine code, so there doesn't seem to be anything
further downstream breaking because of this.
So my questions are:
* What is the purpose of this assertion?
* What is the right way to handle this situation in an unaligned target?
Thanks,
Gergo
More information about the llvm-dev
mailing list