diff --git a/tests/alive-tv/asm-align-bug.srctgt.ll b/tests/alive-tv/asm-align-bug.srctgt.ll new file mode 100644 index 000000000..145f95433 --- /dev/null +++ b/tests/alive-tv/asm-align-bug.srctgt.ll @@ -0,0 +1,11 @@ +; RUN: %alive-tv --tgt-is-asm %s + +define i24 @src(ptr %p) { + %v = load i24, ptr %p, align 4 + ret i24 %v +} + +define i24 @tgt(ptr %p) { + %v = load i24, ptr %p, align 1 + ret i24 %v +} diff --git a/tools/transform.cpp b/tools/transform.cpp index ee5810678..9cb2f8ecd 100644 --- a/tools/transform.cpp +++ b/tools/transform.cpp @@ -1943,7 +1943,8 @@ void Transform::preprocess() { unsigned bits = tgt_i->getType().bits(); auto it = src_loads.find(bits); if (it != src_loads.end()) { - auto new_align = min(min(it->second, min_loads), uint64_t(bits/8)); + auto new_align = min(min(it->second, min_loads), + bit_floor(uint64_t(bits/8))); if (tgt_i->getAlign() < new_align) tgt_i->setAlign(new_align); } @@ -1953,7 +1954,8 @@ void Transform::preprocess() { unsigned bits = tgt_i->getValue().getType().bits(); auto it = src_stores.find(bits); if (it != src_stores.end()) { - auto new_align = min(min(it->second, min_stores), uint64_t(bits/8)); + auto new_align = min(min(it->second, min_stores), + bit_floor(uint64_t(bits/8))); if (tgt_i->getAlign() < new_align) tgt_i->setAlign(new_align); }