Question about 'DuplicateInstruction' function of TailDuplicatePass in CodeGen

Hi all,

I have faced a little bit of a strange transformation from the TailDuplicatePass In CodeGen. When the pass clones the contents of TailBB into PredBB, the bundled instructions in TailBB are not bundled in PredBB. I think the reason why it is not bundled is that the 'DuplicateInstruction' function does not set up the flag of the first instruction of the bundle in PredBB when it is cloned from TailBB. If the first instruction of the bundle is set up in PredBB, the 'MachineBasicBlock->insert()' function would automatically put the next instructions into the bundle. How do you feel about this?

I did not find the API in order to make the first instruction of the bundle. I have added simple code to make bundled instructions from the 'DuplicateInstruction' function. As a reference, I have attached a simple patch. If there is something wrong, please let me know.

Thanks,
JinGu Kang

simple_patch.txt (551 Bytes)

Hi all,

Could someone comment about the email below please?

In particular, are there any problems with creating a bundle while cloning, or are there any passes that depend on the instructions being unbundled?

I am working on a new backend with LLVM. Your comments will be helpful for me to implement code.

Thanks,
JinGu Kang

I have a hard time following your description. I think you need to provide code snippets and illustrate the problem better.

That said, I don't think your simple patch is safe. Tail duplication shouldn't partially duplicate a bundle. Either the entire bundle is duplicated or it should not be duplicated at all.

Evan

Hi Evan,

I appreciate your response.

I have added a target-specific codegen pass into 'addPostRegAlloc()' and it makes instruction bundles. As I mentioned in my previous e-mail, the problem I have is that the "TailDuplication" pass duplicates bundled instructions to unbundled instructions.

The abstract shapes of predecessor and tail machine basic blocks are as follows:
BB#Pred:
         %R23<def> = MUL %R15<kill>, %R23<kill>
         JUMP <BB#Tail>
     Successors according to CFG: BB#Tail
...
BB#Tail:
         %R30<def> = LOAD_SYMBOL<es:function_name>
          JUMP_INDIRECT %R30
           * Bundled instruction

As you know, the "TailDuplication" pass tries to duplicate the instructions from 'BB#Tail' to 'BB#Pred'. After duplicating the instructions, the shape of 'BB#Pred" is as follows:

BB#Pred:
         %R23<def> = MUL %R15<kill>, %R23<kill>
         %R30<def> = LOAD_SYMBOL<es:function_name>
          JUMP_INDIRECT %R30
          Bundled instruction

I think that the default 'TargetInstrInfo::duplicate()' function does not keep the BundledPred and BundledSucc flags, and thus the 'MachineBasicBlock::insert' function does not make bundled instructions.

I wanted to check whether the "TailDuplication" pass duplicates the instruction bundles or not. In order to add support to duplicate instruction bundles, do I need to target a specific hook of 'TargetInstrInfo::duplicate()' to set up the flags?

If you see any problems that I may overlooked, please let me know.

Thanks,
JinGu Kang