[llvm-dev] TableGen error message: top-level forms in instruction pattern should have void types

Phil Tomson via llvm-dev llvm-dev at lists.llvm.org
Thu Jan 7 14:54:27 PST 2016


On Thu, Jan 7, 2016 at 1:35 PM, Krzysztof Parzyszek <kparzysz at codeaurora.org
> wrote:

> On 1/7/2016 3:25 PM, Phil Tomson wrote:
>
>>
>> That's better, but now I get:
>>
>>   XSTGInstrInfo.td:902:3: error: In RelAddr: XSTGRELADDR node requires
>> exactly 2 operands!
>>
>> Which makes some sense as XSTGRELADDR is defined as:
>> def SDT_RELADDR       : SDTypeProfile<1, 2, [SDTCisInt<0>,
>> SDTCisSameAs<0, 1>]>;
>> def XSTGRELADDR       : SDNode<"XSTGISD::RELADDR", SDT_RELADDR>;
>>
>
> The problem is that the pattern that you use in the instruction definition
> cannot have any value.  That is, the top node has to consume all values
> produced by the nodes below it.  The node XSTGRELADDR does have a value,
> and so it cannot be the top node.
> If the intent is to have the second operand as the target register for
> that value, it shouldn't be an operand to the SDNode, and in the
> instruction definition it should be listed in the (outs) list.  If the
> second operand is not an output operand, then the RelAddr instruction
> should have some additional operand in (outs) and use "set ..." in the
> pattern, or have some other consumer as the top node in the selection
> pattern.
>
>
>

Let me explain what I'm trying to achieve: In certain relocation modes we
need to have addresses for symbols be relative to a special pointer
register we call GRP. For example, let's say we want to access a global
variable called 'answer'. The relevant part of the .ll file looks like:

@answer = addrspace(4) global i32 42, align 4
@two = addrspace(3) global i32 2, align 4
@seven = addrspace(2) global i32 7, align 4
@xint = common global i32 0, align 4
@y = global [1 x i32*] [i32* @xint], align 8

; Function Attrs: nounwind uwtable
define i32 @main(i32 %argc, i8** %argv) #0 {
entry:
  %argc.addr = alloca i32, align 4
  %argv.addr = alloca i8**, align 8
  %bint = alloca i32, align 4
  %cint = alloca i32, align 4
  %a = alloca i32**, align 8
  %b = alloca i32*, align 8
  store i32 %argc, i32* %argc.addr, align 4
  store i8** %argv, i8*** %argv.addr, align 8
  %0 = load i32 addrspace(4)* @answer, align 4
  store i32 %0, i32* @xint, align 4
...

Currently this produces the following assembly code:
.Ltmp0:
    .cfi_def_cfa_offset 48
    store        r510, r509, 0, 64
.Ltmp1:
    .cfi_offset 510, -48
    bitop1        r510, r509, 0, OR, 64
.Ltmp2:
    .cfi_def_cfa_register 510
    store        r0, r510, 44, 32
    store        r1, r510, 32, 64
    movimm        r0, %hi(xint), 64
    movimmshf32    r0, r0, %lo(xint)
    movimm        r1, %rel(answer), 64  #<--- relevant lines
    load        r1, r1, 0, 32                      #<---
...
(%rel is a macro that returns the delta from the global section to the
'answer' symbol)

Instead of that last load instruction there, I want it to be:

    load       r1, GRP, r1, 32 # r1 <-mem[GRP+r1]

GRP is what we call the Global Relocation Pointer - it  holds the address
of the global address segment. So what this should do is load the contents
pointed to by the address (GRP+r1) into r1.

Of course, this is only if a non-static relocation model is chosen via
commandline options.

Phil
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160107/690d3ede/attachment-0001.html>


More information about the llvm-dev mailing list