<html><body><p><font size="2">Hi,</font><br><br><font size="2">There is an opportunity in instCombine for following instruction pattern:</font><br><br>%mul = mul nsw i32 %b, %a<br>%cmp = icmp sgt i32 %mul, -1<b><br></b>%sub = sub i32 0, %a<br>%mul2 = mul nsw i32 %sub, %b<br>%cond = select i1 %cmp, i32 %mul, i32 %mul2<br><br><font size="2">Source code for above pattern:</font><br><font size="2">   return (a*b) >=0 ? (a*b) : -a*b;</font><br><br><font size="2">Currently, llvm(-O3) can not recognize this as abs(a*b).</font><br><br><font size="2">I initially think we could do this in instCombine phase in opt. Below is what I think:</font><br><br>%res = OP i32 %b, %a<br>%sub = sub i32 0, %b<br>%res2 = OP i32 %sub, %a<br><br><font size="2">We could do the transform:</font><br>%res2 = OP i32 %sub, %a<font size="2">   ==>  </font>%res2 = sub i32 0, %res<br><br>Then we can get the advantage:<br>1: if %res2 is the only user of %sub, %sub can be eliminated;<br>2: if %res2 is not the only user of %sub, we could change some heavy instruction like div to sub;<br>3: expose more abs opportunity for later pass.<br><br><font size="2">But my concern is finding %res is a little compiling time-consuming. </font><br><font size="2">At least we need MIN(user_count(%b), user_count(%a)) times to check if instruction with same opcode and same operands exists.</font><br><br><font size="2">Could you guys give some comment? Is there any better idea for this transform?</font><br><br><font size="2">Thanks.</font><br><br><font size="2">BRS//</font><br><font size="2">Chen Zheng</font><br><font size="2">Power Compiler Backend Developer</font><br><BR>
</body></html>