[LLVMdev] SelectionDAG

Joshua Nedrud nedrud at email.arizona.edu
Tue Jan 10 13:23:46 PST 2012


Hello,
	I am working on a AVR backend and have a version up and running that will convert LLVM IR code to assembly code for my target.  I have written a bunch of instructions from the AVR Instruction Set in AVRInstrInfo.td and not much else. In a simple test case I am attempting to compile (if that is the word you are supposed to use for this operation) test.ll:

define i8 @foo(i8 %a, i8 %b) {
entry:
	%c = sub i8 %a, 5
	ret i8 %c
}

with `build/Debug/bin/llc -march=avr llvm.ll -o -` and I receive:

	.file	"test.ll"
	.text
	.global	foo
	.type	foo, at function
foo:                                    # @foo
# BB#0:                                 # %entry
	MOV	r22, r24
	LDI	r24, -5
	ADD	r24, r18
	RET
.tmp0:
	.size	foo, .tmp0-foo

While I would like the output as such:

	.file	"test.ll"
	.text
	.global	foo
	.type	foo, at function
foo:                                    # @foo
# BB#0:                                 # %entry
	SUB	r24, 5
	RET
.tmp0:
	.size	foo, .tmp0-foo

With that my question is how to get LLVM to select SUB instead of the pattern above. I have tried to place SUB8ri (see below) before the ADD8rr instruction in the .td file, but that does not seem to make a difference. *things to note, the AVR instruction set does not contain a ADD8ri, so I would eventually like to convert all add register and immediate to subtract register and -immediate, but for now if I could just get LLVM to use SUB8ri in the most straightforward case that would work for me. Thanks,
	Joshua

// SUB8ri definition
let Constraints = "$src = $dst" in
def SUB8ri : Instruction {
  let Namespace = "AVR";
  dag OutOperandList = (outs GPR8:$dst);
  dag InOperandList  = (ins GPR8:$src, i8imm:$src2);
  let AsmString   = "SUB\t{$dst, $src2}";
  let Pattern = [(set GPR8:$dst, (opnode GPR8:$src, imm:$src2))];
}

Joshua Nedrud
Master of Science, Biomedical Engineering












More information about the llvm-dev mailing list