[AVR] Fix codegen bug in 16-bit loads
authorDylan McKay <me@dylanmckay.io>
Sun, 20 Jan 2019 03:41:08 +0000 (03:41 +0000)
committerDylan McKay <me@dylanmckay.io>
Sun, 20 Jan 2019 03:41:08 +0000 (03:41 +0000)
commit6afef286d92eb37798928d01bfe6139f005e5c38
tree89280f554f8286967baa5b339dc391027778657f
parent52846ab09a02280f8e79aa56bac557ae36255e5d
[AVR] Fix codegen bug in 16-bit loads

Prior to this patch, the AVR::LDWRdPtr instruction was always lowered to
instructions of this pattern:

    ld  $GPR8, [PTR:XYZ]+
    ld  $GPR8, [PTR]+1

This has a problem; the [PTR] is incremented in-place once, but never
decremented.

Future uses of the same pointer will use the now clobbered value,
leading to the pointer being incorrect by an offset of one.

This patch modifies the expansion code of the LDWRdPtr pseudo
instruction so that the pointer variable is not silently clobbered in
future uses in the same live range.

Bug first reported by Keshav Kini.

Patch by Kaushik Phatak.

llvm-svn: 351673
llvm/lib/Target/AVR/AVRExpandPseudoInsts.cpp
llvm/lib/Target/AVR/AVRISelLowering.cpp
llvm/test/CodeGen/AVR/PR37143.ll [new file with mode: 0644]
llvm/test/CodeGen/AVR/atomics/load16.ll
llvm/test/CodeGen/AVR/load.ll
llvm/test/CodeGen/AVR/pseudo/LDWRdPtr-same-src-dst.mir
llvm/test/CodeGen/AVR/pseudo/LDWRdPtr.mir