diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/match.pd | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr101642.c | 17 |
2 files changed, 22 insertions, 3 deletions
diff --git a/gcc/match.pd b/gcc/match.pd index 4d41b70..19cbad7 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -3641,11 +3641,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (bitop @0 (bswap @1)))) (for cmp (eq ne) (simplify - (cmp (bswap @0) (bswap @1)) - (cmp @0 @1)) + (cmp (bswap@2 @0) (bswap @1)) + (with { tree ctype = TREE_TYPE (@2); } + (cmp (convert:ctype @0) (convert:ctype @1)))) (simplify (cmp (bswap @0) INTEGER_CST@1) - (cmp @0 (bswap @1)))) + (with { tree ctype = TREE_TYPE (@1); } + (cmp (convert:ctype @0) (bswap @1))))) /* (bswap(x) >> C1) & C2 can sometimes be simplified to (x >> C3) & C2. */ (simplify (bit_and (convert1? (rshift@0 (convert2? (bswap@4 @1)) INTEGER_CST@2)) diff --git a/gcc/testsuite/gcc.c-torture/compile/pr101642.c b/gcc/testsuite/gcc.c-torture/compile/pr101642.c new file mode 100644 index 0000000..f8b96f0 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr101642.c @@ -0,0 +1,17 @@ +/* PR middle-end/101642 */ + +int x; + +unsigned short +foo (void) +{ + return __builtin_bswap16 (x) ? : 0; +} + +int +bar (int x, int y) +{ + unsigned short a = __builtin_bswap16 ((unsigned short) x); + unsigned short b = __builtin_bswap16 ((unsigned short) y); + return a == b; +} |