[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)
commit970b0d576c35c296111ffd9be6ffd04c294760db
tree242293bd7d14f3ddb30481a61bc325bde333a682
parent236b0ca79055779c4d024d66dcd0cbc44265df7f
[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.

llvm-svn: 222125
llvm/include/llvm/Support/MathExtras.h
llvm/lib/Target/ARM/Thumb1RegisterInfo.cpp
llvm/test/CodeGen/ARM/thumb1-varalloc.ll
llvm/test/CodeGen/Thumb/large-stack.ll