ARM: allow misaligned local variables in Thumb1 mode.
authorTim Northover <tnorthover@apple.com>
Tue, 14 Oct 2014 22:12:14 +0000 (22:12 +0000)
committerTim Northover <tnorthover@apple.com>
Tue, 14 Oct 2014 22:12:14 +0000 (22:12 +0000)
There's no hard requirement on LLVM to align local variable to 32-bits, so the
Thumb1 frame handling needs to be able to deal with variables that are only
naturally aligned without falling over.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219733 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/Thumb1RegisterInfo.cpp
test/CodeGen/ARM/atomic-op.ll

index fb8aaff926955197cf6cd346838c4b3170dac3c7..d0626311dd1476072aec530e85c46d835c9f3da4 100644 (file)
@@ -364,8 +364,6 @@ rewriteFrameIndex(MachineBasicBlock::iterator II, unsigned FrameRegIdx,
     } else {
       NumBits = 8;
       Scale = 4;
-      assert((Offset & 3) == 0 &&
-             "Thumb add/sub sp, #imm immediate must be multiple of 4!");
     }
 
     unsigned PredReg;
@@ -380,7 +378,7 @@ rewriteFrameIndex(MachineBasicBlock::iterator II, unsigned FrameRegIdx,
 
     // Common case: small offset, fits into instruction.
     unsigned Mask = (1 << NumBits) - 1;
-    if (((Offset / Scale) & ~Mask) == 0) {
+    if (Offset % Scale == 0 && ((Offset / Scale) & ~Mask) == 0) {
       // Replace the FrameIndex with sp / fp
       if (Opcode == ARM::tADDi3) {
         MI.setDesc(TII.get(Opcode));
index c0171a8da1212972b71d73375fdc92f4018366bd..1ac86485c5562039747a80957858b1afa442b837 100644 (file)
@@ -4,6 +4,8 @@
 ; RUN: llc < %s -mtriple=thumbv6-apple-ios -verify-machineinstrs -mcpu=cortex-m0 | FileCheck %s --check-prefix=CHECK-M0
 ; RUN: llc < %s -mtriple=thumbv7--none-eabi -thread-model single -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-BAREMETAL
 
+target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
+
 define void @func(i32 %argc, i8** %argv) nounwind {
 entry:
        %argc.addr = alloca i32         ; <i32*> [#uses=1]