[LLVMdev] [LLVMDev] Register Allocation and copy instructions

Jeff Kunkel jdkunk3 at gmail.com
Mon Nov 8 12:04:08 PST 2010


Hi, while writing my register allocator, I have come across a case which
confuses me because the llvm definition cannot be mapped to machine code.

For instance I come across (1) and I reduce it to (2). However a copy
instruction cannot move from EDX to CX. What mechanics in LLVM will tell me
that I cannot make this move during register allocation, or how can I tell
from (1) that I cannot execute %reg16385<def> = COPY %reg16390. Furthermore,
how should I handle this case.

1:
# Machine code for function test5:
Frame Objects:
  fi#-2: size=2, align=4, fixed, at location [SP+8]
  fi#-1: size=2, align=8, fixed, at location [SP+4]
Function Live Outs: %AX

BB#0: derived from LLVM BB %entry
        %reg16390<def> = MOVZX32rm16 <fi#-2>, 1, %reg0, 0, %reg0;
mem:LD2[FixedStack-2] GR32:%reg16390
        %reg16385<def> = COPY %reg16390:sub_16bit<kill>; GR16:%reg16385
GR32:%reg16390
        %reg16391<def> = MOVZX32rm16 <fi#-1>, 1, %reg0, 0, %reg0;
mem:LD2[FixedStack-1] GR32:%reg16391
        %reg16384<def> = COPY %reg16391:sub_16bit<kill>; GR16:%reg16384
GR32:%reg16391
    Successors according to CFG: BB#1
...

2:
BB#0: derived from LLVM BB %entry
        %EDX<def> = MOVZX32rm16 <fi#-2>, 1, %reg0, 0, %reg0;
mem:LD2[FixedStack-2]
        %CX<def> = COPY %EDX
        %ESI<def> = MOVZX32rm16 <fi#-1>, 1, %reg0, 0, %reg0;
mem:LD2[FixedStack-1]
        %AX<def> = COPY %ESI




Below is the full code for the function.

# Machine code for function test5:
Frame Objects:
  fi#-2: size=2, align=4, fixed, at location [SP+8]
  fi#-1: size=2, align=8, fixed, at location [SP+4]
Function Live Outs: %AX

BB#0: derived from LLVM BB %entry
        %reg16390<def> = MOVZX32rm16 <fi#-2>, 1, %reg0, 0, %reg0;
mem:LD2[FixedStack-2] GR32:%reg16390
        %reg16385<def> = COPY %reg16390:sub_16bit<kill>; GR16:%reg16385
GR32:%reg16390
        %reg16391<def> = MOVZX32rm16 <fi#-1>, 1, %reg0, 0, %reg0;
mem:LD2[FixedStack-1] GR32:%reg16391
        %reg16384<def> = COPY %reg16391:sub_16bit<kill>; GR16:%reg16384
GR32:%reg16391
    Successors according to CFG: BB#1

BB#1: derived from LLVM BB %bb
    Predecessors according to CFG: BB#0 BB#1
        %reg16386<def> = PHI %reg16385, <BB#0>, %reg16394, <BB#1>;
GR16:%reg16386,16385,16394
        %reg16387<def> = PHI %reg16384, <BB#0>, %reg16398, <BB#1>;
GR16:%reg16387,16384,16398
        %reg16393<def> = MOV16ri 1; GR16:%reg16393
        %reg16398<def> = COPY %reg16387; GR16:%reg16398,16387
        %reg16398<def> = XOR16rr %reg16398, %reg16386, %EFLAGS<imp-def>;
GR16:%reg16398,16386
        %reg16397<def> = COPY %reg16398; GR16:%reg16397,16398
        %reg16397<def> = XOR16ri %reg16397, 32767, %EFLAGS<imp-def>;
GR16:%reg16397
        %reg16396<def> = COPY %reg16397; GR16:%reg16396,16397
        %reg16396<def> = AND16rr %reg16396, %reg16386, %EFLAGS<imp-def>;
GR16:%reg16396,16386
        %reg16394<def> = COPY %reg16396; GR16:%reg16394,16396
        %reg16394<def> = SHL16ri %reg16394, 1, %EFLAGS<imp-def>;
GR16:%reg16394
        CMP16ri %reg16394, 0, %EFLAGS<imp-def>; GR16:%reg16394
        JNE_4 <BB#1>, %EFLAGS<imp-use>
    Successors according to CFG: BB#2 BB#1

BB#2: derived from LLVM BB %bb12
    Predecessors according to CFG: BB#1
        %AX<def> = COPY %reg16398; GR16:%reg16398
        RET

# End machine code for function test5.

# After Register Allocation:
# Machine code for function test5:
Frame Objects:
  fi#-2: size=2, align=4, fixed, at location [SP+8]
  fi#-1: size=2, align=8, fixed, at location [SP+4]
Function Live Outs: %AX

BB#0: derived from LLVM BB %entry
        %EDX<def> = MOVZX32rm16 <fi#-2>, 1, %reg0, 0, %reg0;
mem:LD2[FixedStack-2]
        %CX<def> = COPY %EDX
        %ESI<def> = MOVZX32rm16 <fi#-1>, 1, %reg0, 0, %reg0;
mem:LD2[FixedStack-1]
        %AX<def> = COPY %ESI
    Successors according to CFG: BB#1

BB#1: derived from LLVM BB %bb
    Predecessors according to CFG: BB#0 BB#1
        %AX<def> = XOR16rr %AX, %CX, %EFLAGS<imp-def>
        %DX<def> = COPY %AX
        %DX<def> = XOR16ri %DX, 32767, %EFLAGS<imp-def>
        %DX<def> = AND16rr %DX, %CX, %EFLAGS<imp-def>
        %CX<def> = SHL16ri %CX, 1, %EFLAGS<imp-def>
        CMP16ri %CX, 0, %EFLAGS<imp-def>
        JNE_4 <BB#1>, %EFLAGS<imp-use>
    Successors according to CFG: BB#2 BB#1

BB#2: derived from LLVM BB %bb12
    Predecessors according to CFG: BB#1
        RET
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20101108/56e4bc55/attachment.html>


More information about the llvm-dev mailing list