diff --git a/lib/Target/ARM/ARMInstrInfo.td b/lib/Target/ARM/ARMInstrInfo.td index 2bb89765955..f0e145a394b 100644 --- a/lib/Target/ARM/ARMInstrInfo.td +++ b/lib/Target/ARM/ARMInstrInfo.td @@ -2708,7 +2708,8 @@ multiclass AI2_stridx { + opc, "\t$Rt, $addr!", + "$addr.base = $Rn_wb,@earlyclobber $Rn_wb", []> { bits<17> addr; let Inst{25} = 0; let Inst{23} = addr{12}; // U (add = ('U' == 1)) @@ -2720,7 +2721,8 @@ multiclass AI2_stridx { + opc, "\t$Rt, $addr!", + "$addr.base = $Rn_wb,@earlyclobber $Rn_wb", []> { bits<17> addr; let Inst{25} = 1; let Inst{23} = addr{12}; // U (add = ('U' == 1)) @@ -2733,7 +2735,7 @@ multiclass AI2_stridx { + "$addr.base = $Rn_wb,@earlyclobber $Rn_wb", []> { // {12} isAdd // {11-0} imm12/Rm bits<14> offset; @@ -2751,7 +2753,7 @@ multiclass AI2_stridx { + "$addr.base = $Rn_wb,@earlyclobber $Rn_wb", []> { // {12} isAdd // {11-0} imm12/Rm bits<14> offset; diff --git a/test/CodeGen/ARM/2014-07-18-earlyclobber-str-post.ll b/test/CodeGen/ARM/2014-07-18-earlyclobber-str-post.ll new file mode 100644 index 00000000000..9ea762ae9bf --- /dev/null +++ b/test/CodeGen/ARM/2014-07-18-earlyclobber-str-post.ll @@ -0,0 +1,13 @@ +; RUN: llc -mtriple=armv7-linux-gnueabihf %s -o - | FileCheck %s + +; Check that we don't create an unpredictable STR instruction, +; e.g. str r0, [r0], #4 + +define i32* @earlyclobber-str-post(i32* %addr) nounwind { +; CHECK: earlyclobber-str-post +; CHECK-NOT: str r[[REG:[0-9]+]], [r[[REG]]], #4 + %val = ptrtoint i32* %addr to i32 + store i32 %val, i32* %addr + %new = getelementptr i32* %addr, i32 1 + ret i32* %new +}