How to implement register allocation constraints to guide allocator dispatching different registers for certain instruction?

Hi,

To fix this bug(http://llvm.org/bugs/show_bug.cgi?id=18881), we need to add more register constraints that for STLXR , Ws and Wt should not be the same register. Because these unpredictable instructions are valid instructions in MC layer, we couldn’t just simply treat them as unallocated encoding.
I suppose to add some extra rules on register allocator to avoid it allocating register causing any unpredictable behavior, but I don’t have experience to this part. Can anybody tell me how to implement this or have better ideas to solve this problem? Thanks in advance.

Hi Kevin,

I suppose to add some extra rules on register allocator to avoid it
allocating register causing any unpredictable behavior, but I don't have
experience to this part. Can anybody tell me how to implement this or have
better ideas to solve this problem? Thanks in advance.

I think this is what the "@earlyclobber" constraint is for: if you
mark the status output register as @earlyclobber then LLVM will think
it gets written early on during the instruction (i.e. before the CPU
would get a chance to read the other two) and make sure it gets
allocated to a different register.

Cheers.

Tim.

Hi Kevin,

I concur Tim’s advice, you should use the @earlyclobber.

Cheers,
-Quentin

Hi Tim and Quentin,

Thanks a lot for your help. This solution is quite simple and works well! Patch is in http://llvm-reviews.chandlerc.com/D2844, please review:)

Hi,
To generate a call graph for a file(say foo.c), I can do:

clang -S -emit-llvm foo.c -o - | opt -analyze -dot-callgraph

However with this approach I have to run this command and pipe to opt
every single time I need to generate a callgraph.

For a project with many files and a complex build system, it would be
preferable for me to be able to invoke this transform as part of normal
build process by the use of some clang flag. Can I do something like:

clang -run-dot-callgraph-transform-flag foo.c ?
This would allow me to just modify the CFLAGS in Makefile and get results
as part of normal build process?

If this can't be done with stock clang, what can I modify in llvm source
to get something like this?

Thanks,
Harsh