<br><div class="gmail_extra"><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+static void detectLog2OfHalf(Value *&Op, Value *&Y, IntrinsicInst *&Log2) {<br>
+ if (Op->hasOneUse()) {<br>
+ if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Op)) {<br>
+ if (II->getIntrinsicID() == Intrinsic::log2 &&<br>
+ II->hasUnsafeAlgebra()) {<br>
+ Log2 = II;<br>
+ Value *OpLog2Of = II->getArgOperand(0);<br>
+ if (OpLog2Of->hasOneUse()) {<br>
+ if (Instruction *I = dyn_cast<Instruction>(OpLog2Of)) {<br>
+ if (I->getOpcode() == Instruction::FMul &&<br>
+ I->hasUnsafeAlgebra()) {<br>
+ ConstantFP *CFP = dyn_cast<ConstantFP>(I->getOperand(0));<br>
+ if (CFP && CFP->isExactlyValue(0.5)) {<br>
+ Y = I->getOperand(1);<br>
+ } else {<br>
+ CFP = dyn_cast<ConstantFP>(I->getOperand(1));<br>
+ if (CFP && CFP->isExactlyValue(0.5)) {<br>
+ Y = I->getOperand(0);<br>
+ }<br>
+ }<br>
+ }<br>
+ }<br>
+ }<br>
+ }<br>
+ }<br>
+ }<br>
+}<br>
+<br></blockquote><div><br></div><div>Trivially fwiw,</div><div><br></div><div>if (!Op->hasOneUse()) return false;</div><div>if (!isa<IntrinsicInst>(Op)) return false;</div><div><br></div><div>and just change it to return true/false if you've managed to do something or not.</div>
<div><br></div><div>-eric </div></div></div>