[llvm-commits] [llvm] r52073 - in /llvm/trunk: lib/Transforms/Utils/SimplifyCFG.cpp test/Transforms/SimplifyCFG/SpeculativeExec.ll

Evan Cheng evan.cheng at apple.com
Wed Jun 25 00:50:08 PDT 2008


On Jun 24, 2008, at 11:15 AM, Chris Lattner wrote:

> On Jun 7, 2008, at 1:52 AM, Evan Cheng wrote:
>> Author: evancheng
>> Date: Sat Jun  7 03:52:29 2008
>> New Revision: 52073
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=52073&view=rev
>> Log:
>> Speculatively execute a block when the the block is the then part of
>> a triangle shape and it contains a single, side effect free, cheap
>> instruction. The branch is eliminated by adding a select
>> instruction. i.e.
>
> Ok
>
>> @@ -955,6 +955,109 @@
>> +static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock  
>> *BB1) {
>> +  // Only speculatively execution a single instruction (not
>> counting the
>> +  // terminator) for now.
>> +  if (BB1->size() != 2)
>> +    return false;
>
> This is O(n) for a check that should be O(1).  Can you do something
> (admittedly gross) like this:
>
> BasicBlock::iterator I = BB1->begin();
> ++I; // must have at least a terminator
> if (I == BB1->end()) return false; // only one inst
> ++I;
> if (I != BB1->end()) return false; // more than 2 insts.
>

Alright. Done.

>> +  Instruction *I = BB1->begin();
>> +  switch (I->getOpcode()) {
>> +  default: return false;  // Not safe / profitable to hoist.
>> +  case Instruction::Add:
>> +  case Instruction::Sub:
>> +  case Instruction::And:
>> +  case Instruction::Or:
>> +  case Instruction::Xor:
>> +  case Instruction::Shl:
>> +  case Instruction::LShr:
>> +  case Instruction::AShr:
>> +    if (I->getOperand(0)->getType()->isFPOrFPVector())
>> +      return false;  // FP arithmetic might trap.
>> +    break;   // These are all cheap and non-trapping instructions.
>> +  }
>
> Is this worthwhile to do for vector operations?

Probably not. Fixed.

Evan

>
>
> -Chris
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list