[LLVMdev] splitting a branch within a pseudo

Reed Kotler rkotler at mips.com
Sun Feb 17 12:51:52 PST 2013


After discussions last night, I'm leaning towards going legit with all 
my pseudo expansions in Mips 16.

Some I think I can clearly do by just putting in the proper side effects 
of implicit registers (T8 the condition code register as used by mips 16).

But I'm still left with some pseudos that have jmp .+4 type instructions 
in them.

The original Mips port was to Mips I and Mips I, like Mips 16, has no 
conditional store instructions.

There was some super ugly code there to do a test and then branch around 
the store instruction if the test was not matched. It was quite a large 
amount of code and I'm not sure I even believe it works. It's long been 
commented out since we don't even support Mips I anymore.

I avoided that in Mips 16 by writing some patterns that translate to 
something like:

cmp rx, ry  ; implicitly set T8
btnez foo:  ; branch if T8 not zero
mov ra, rb
foo:....

There is a way to do this in Mips asembler without needing to really 
create a label. There are builtin forward and backward labels you can 
use for this and that's what I do in some cases and in other cases I 
think I just do a .+4 or something.

SOmething like that. You can see the mips 16 patterns if you want to 
know the details but they are not important here IMO.

In principle I should really make machine basic blocks and do all that 
book keeping but at least the original way is way too complicated and as 
I said, I'm not sure I believe it even works in all cases. Too many
complex assumptions about the optimizer and such.

Any ideas or code pointers for creating the kind of machine basic blocks 
I would need to do the above without resorting to bundles?

I like simple.

Simple usually works always and complex always has at least one more bug. :)

Tia.

Reed






More information about the llvm-dev mailing list