From: Tilmann Scheller Date: Fri, 18 Jul 2014 12:05:49 +0000 (+0000) Subject: [ARM] Add earlyclobber constraint to pre/post-indexed ARM STR instructions. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0fc933d6b81d3841f7e67d8a1adcffc5999493e8;p=platform%2Fupstream%2Fllvm.git [ARM] Add earlyclobber constraint to pre/post-indexed ARM STR instructions. The post-indexed instructions were missing the constraint, causing unpredictable STR instructions to be emitted. The earlyclobber constraint on the pre-indexed STR instructions is not strictly necessary, as the instruction selection for pre-indexed STR instructions goes through an additional layer of pseudo instructions which have the constraint defined, however it doesn't hurt to specify the constraint directly on the pre-indexed instructions as well, since at some point someone might create instances of them programmatically and then the constraint is definitely needed. This fixes PR20323. llvm-svn: 213369 --- diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td index 2bb8976..f0e145a 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/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/llvm/test/CodeGen/ARM/2014-07-18-earlyclobber-str-post.ll b/llvm/test/CodeGen/ARM/2014-07-18-earlyclobber-str-post.ll new file mode 100644 index 0000000..9ea762a --- /dev/null +++ b/llvm/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 +}