Can gatekeeper help review this patch?
This is a bug in cflow optimization exposed when a cmpi32 is changed to
cmpi8

int main()
{
long long ll = 0x7EF0LL;
unsigned char c = (char) ll;
if (c != 0xf0)
   return 1;
return 0;
}

opencc -O0, run result's value is 0.
opencc -O1, run result's value is 1.
This is a problem in O2 or higher is because wopt handle remove this branch.


without mov-ext in EBO, cflow can't optimize convert the if branch into goto
opencc -O1 -CG:movext_icmp=off
[   2, 0] GTN4(%rsp) :- spadjust GTN4(%rsp)<defopnd> (0x0) ;
[   3, 0] TN149 :- ldc64 (0x7ef0) ;
[   3, 0] :- store64 TN149 GTN4(%rsp) (sym:ll+0) ;
[   4, 0] :- store8 TN149 GTN4(%rsp) (sym:c+0) ;
[   0, 0] TN152 :- movzbl TN149 ;
[   5, 0] TN33(%rflags) :- cmpi32 TN152 (0xf0) ;
[   5, 0] :- je TN33(%rflags) (lab:.L_0_770) ;

when turn on movext_icmp
[   3, 0] TN149 :- ldc64 (0x7ef0) ;
[   3, 0] :- store64 TN149 GTN4(%rsp) (sym:ll+0) ;
[   4, 0] :- store8 TN149 GTN4(%rsp) (sym:c+0) ;
[   5, 0] TN33(%rflags) :- cmpi8 TN149 (0xf0) ;
[   5, 0] :- je TN33(%rflags) (lab:.L_0_770) ;

it get TN149's value is 0x7ef0, then directly compare with 0xf0 without
truncate.

There is original a function Extend_Short_Cmp_Src, truncate and sign extend
short sign value for compare constant.
The fix is truncate the constant to one bytes or two bytes if compare is
short unsigned compare.

Attachment: cflow.patch
Description: Binary data

------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today
http://p.sf.net/sfu/msIE9-sfdev2dev
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to