OSDN Git Service

[Thumb1] Re-write emitThumbRegPlusImmediate
authorOliver Stannard <oliver.stannard@arm.com>
Mon, 17 Nov 2014 11:18:10 +0000 (11:18 +0000)
committerOliver Stannard <oliver.stannard@arm.com>
Mon, 17 Nov 2014 11:18:10 +0000 (11:18 +0000)
commit8f832fce3b4613bcdd35362b2fb0ae84c7d4d78d
tree1f96c6d0fa8e6680f8b0ed1f6c27c70f57baf065
parenta18e46cbc92cde1b5eaa8eea83df6d5821d22680
[Thumb1] Re-write emitThumbRegPlusImmediate

This was motivated by a bug which caused code like this to be
miscompiled:
  declare void @take_ptr(i8*)
  define void @test() {
    %addr1.32 = alloca i8
    %addr2.32 = alloca i32, i32 1028
    call void @take_ptr(i8* %addr1)
    ret void
  }

This was emitting the following assembly to get the value of %addr1:
  add r0, sp, #1020
  add r0, r0, #8
However, "add r0, r0, #8" is not a valid Thumb1 instruction, and this
could not be assembled. The generated object file contained this,
resulting in r0 holding SP+8 rather tha SP+1028:
  add r0, sp, #1020
  add r0, sp, #8

This function looked like it could have caused miscompilations for
other combinations of registers and offsets (though I don't think it is
currently called with these), and the heuristic it used did not match
the emitted code in all cases.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222125 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Support/MathExtras.h
lib/Target/ARM/Thumb1RegisterInfo.cpp
test/CodeGen/ARM/thumb1-varalloc.ll
test/CodeGen/Thumb/large-stack.ll