[PATCH] [Thumb1] Re-write emitThumbRegPlusImmediate

Oliver Stannard oliver.stannard at arm.com
Tue Nov 11 02:02:04 PST 2014


Hi t.p.northover,

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.

http://reviews.llvm.org/D6211

Files:
  lib/Target/ARM/Thumb1RegisterInfo.cpp
  test/CodeGen/ARM/thumb1-varalloc.ll
  test/CodeGen/Thumb/large-stack.ll
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D6211.16031.patch
Type: text/x-patch
Size: 16549 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141111/e55419b5/attachment.bin>


More information about the llvm-commits mailing list