Hello, looking at X86 codegen, I see this: void ISel::copyConstantToRegister(MachineBasicBlock *MBB, MachineBasicBlock::iterator IP, Constant *C, unsigned R) { if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { ..... case Instruction::Add: emitSimpleBinaryOperation(MBB, IP, CE->getOperand(0), CE->getOperand(1), Class, R); I'm not sure I understand this logic. If we have "1 + 2" as constant expression, then why emit the code to perform addition? It should be possible to just fold the expression and copy immediate "3" into a register. I must be missing something, but what? Another question is about TargetInstrInfo::CreateCodeToLoadConst. This seems like a perfect fit for the task, but it's not used in X86 backend at all. Further, the destination register is represented by Instruction*, and not by integer number as elsewhere. What does that Instruction* mean? Thanks, Volodya
On Mon, 7 Jun 2004, Vladimir Prus wrote:> > Hello, > looking at X86 codegen, I see this: > > void ISel::copyConstantToRegister(MachineBasicBlock *MBB, > MachineBasicBlock::iterator IP, > Constant *C, unsigned R) { > if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { > ..... > case Instruction::Add: > emitSimpleBinaryOperation(MBB, IP, CE->getOperand(0), > CE->getOperand(1), > Class, R); > > I'm not sure I understand this logic. If we have "1 + 2" as constant > expression, then why emit the code to perform addition? It should be possible > to just fold the expression and copy immediate "3" into a register. > > I must be missing something, but what?LLVM constant expressions are used when it is not possible to fold the constant. In particular expressions like "10/0" are not constant foldable (so it must be evaluated at runtime), and link-time constants are not foldable... stuff like: int X; int Y; int Z = (int)&X-(int)&Y; Yes, this is gross and disturbing, but we do support it. Constant expressions are the reason why there is a separation in the X86 isel between the "visit" methods and the "emit" methods.> Another question is about TargetInstrInfo::CreateCodeToLoadConst. This seems > like a perfect fit for the task, but it's not used in X86 backend at all. > Further, the destination register is represented by Instruction*, and not by > integer number as elsewhere. What does that Instruction* mean?This is a deprecated method that is only used by the SparcV9 backend. It used an extremely different way of representing virtual registers based on Value*'s. It turns out that doing this has some serious problems, so we are slowly migrating away from it. -Chris -- http://llvm.cs.uiuc.edu/ http://www.nondot.org/~sabre/Projects/
Chris Lattner wrote:> > I'm not sure I understand this logic. If we have "1 + 2" as constant > > expression, then why emit the code to perform addition? It should be > > possible to just fold the expression and copy immediate "3" into a > > register. > > > > I must be missing something, but what? > > LLVM constant expressions are used when it is not possible to fold the > constant. In particular expressions like "10/0" are not constant foldable > (so it must be evaluated at runtime), and link-time constants are not > foldable... stuff like: > > int X; > int Y; > int Z = (int)&X-(int)&Y; > > Yes, this is gross and disturbing, but we do support it. Constant > expressions are the reason why there is a separation in the X86 isel > between the "visit" methods and the "emit" methods.Thanks for the explanation?> > Another question is about TargetInstrInfo::CreateCodeToLoadConst. This > > seems like a perfect fit for the task, but it's not used in X86 backend > > at all. Further, the destination register is represented by Instruction*, > > and not by integer number as elsewhere. What does that Instruction* mean? > > This is a deprecated method that is only used by the SparcV9 backend. It > used an extremely different way of representing virtual registers based on > Value*'s. It turns out that doing this has some serious problems, so we > are slowly migrating away from it.Understood. It looks like a lot of methods in TargetMachine are for Sparc backend only, right? - Volodya