From: Richard Osborne Date: Tue, 4 Mar 2014 16:50:30 +0000 (+0000) Subject: [XCore] Fix call of absolute address. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=f41c05c7ca1245caecf6bb4f8ecacd62c59f3995;p=oota-llvm.git [XCore] Fix call of absolute address. Previously for: tail call void inttoptr (i64 65536 to void ()*)() nounwind We would emit: bl 65536 The immediate operand of the bl instruction is a relative offset so it is wrong to use the absolute address here. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202860 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/XCore/XCoreInstrInfo.td b/lib/Target/XCore/XCoreInstrInfo.td index b6906569aa3..00cb705c8d3 100644 --- a/lib/Target/XCore/XCoreInstrInfo.td +++ b/lib/Target/XCore/XCoreInstrInfo.td @@ -718,10 +718,10 @@ def BLACP_u10 : _FU10<0b111000, (outs), (ins i32imm:$a), "bla cp[$a]", []>; def BLACP_lu10 : _FLU10<0b111000, (outs), (ins i32imm:$a), "bla cp[$a]", []>; def BLRF_u10 : _FU10<0b110100, (outs), (ins pcrel_imm:$a), "bl $a", - [(XCoreBranchLink immU10:$a)]>; + []>; def BLRF_lu10 : _FLU10<0b110100, (outs), (ins pcrel_imm:$a), "bl $a", - [(XCoreBranchLink immU20:$a)]>; + [(XCoreBranchLink tglobaladdr:$a)]>; def BLRB_u10 : _FU10<0b110101, (outs), (ins pcrel_imm_neg:$a), "bl $a", []>; @@ -1113,7 +1113,6 @@ def WAITEU_0R : _F0R<0b0000001100, (outs), (ins), // Non-Instruction Patterns //===----------------------------------------------------------------------===// -def : Pat<(XCoreBranchLink tglobaladdr:$addr), (BLRF_lu10 tglobaladdr:$addr)>; def : Pat<(XCoreBranchLink texternalsym:$addr), (BLRF_lu10 texternalsym:$addr)>; /// sext_inreg diff --git a/test/CodeGen/XCore/call.ll b/test/CodeGen/XCore/call.ll new file mode 100644 index 00000000000..06a12f14440 --- /dev/null +++ b/test/CodeGen/XCore/call.ll @@ -0,0 +1,10 @@ +; RUN: llc < %s -march=xcore | FileCheck %s + +; CHECK-LABEL: bl_imm: +; CHECK: ldw [[R0:r[0-9]+]], cp +; CHECK: bla [[R0]] +define void @bl_imm() nounwind { +entry: + tail call void inttoptr (i64 65536 to void ()*)() nounwind + ret void +}