[llvm-commits] [llvm] r149597 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp test/CodeGen/X86/uint64-to-float.ll
Jakob Stoklund Olesen
stoklund at 2pi.dk
Thu Feb 2 11:07:34 PST 2012
On Feb 1, 2012, at 11:48 PM, Lang Hames wrote:
> Author: lhames
> Date: Thu Feb 2 01:48:37 2012
> New Revision: 149597
>
> URL: http://llvm.org/viewvc/llvm-project?rev=149597&view=rev
> Log:
> Set EFLAGS correctly in EmitLoweredSelect on X86.
>
> Modified:
> llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
> llvm/trunk/test/CodeGen/X86/uint64-to-float.ll
>
> +// Check whether the given instruction should have had a kill marker on
> +// the EFLAGS operand.
> +static bool shouldHaveEFlagsKill(MachineBasicBlock::iterator SelectItr,
I think the function name should reflect that you are actually recomputing and changing the kill flag.
> + if (mi.definesRegister(X86::EFLAGS)) {
> + // Should have kill-flag - update below.
> + break;
> + }
Technically, you want modifiesRegister() here, although there is no difference when EFLAGS has no aliases.
> + // We found a def, or hit the end of the basic block. SelectMI should have a
> + // kill flag on EFLAGS.
Not so fast! What if EFLAGS is live out of the block?
> + MachineInstr& SelectMI = *SelectItr;
> + MachineOperand* EFlagsOp = SelectMI.findRegisterUseOperand(X86::EFLAGS);
> + assert(EFlagsOp != 0 && "No EFLAGS operand on select instruction?");
> + EFlagsOp->setIsKill();
Just use MI->addRegisterKilled() here.
> + return true;
> +}
> +
> MachineBasicBlock *
> X86TargetLowering::EmitLoweredSelect(MachineInstr *MI,
> MachineBasicBlock *BB) const {
> @@ -12089,8 +12114,10 @@
> // If the EFLAGS register isn't dead in the terminator, then claim that it's
> // live into the sink and copy blocks.
> if (!MI->killsRegister(X86::EFLAGS)) {
> - copy0MBB->addLiveIn(X86::EFLAGS);
> - sinkMBB->addLiveIn(X86::EFLAGS);
> + if (!shouldHaveEFlagsKill(MI, BB)) {
> + copy0MBB->addLiveIn(X86::EFLAGS);
> + sinkMBB->addLiveIn(X86::EFLAGS);
> + }
&&?
> --- llvm/trunk/test/CodeGen/X86/uint64-to-float.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/uint64-to-float.ll Thu Feb 2 01:48:37 2012
> @@ -6,37 +6,12 @@
> target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
> target triple = "x86_64-apple-darwin10.0.0"
>
> -; FIXME: This test could generate this code:
Yay!
/jakob
More information about the llvm-commits
mailing list