aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/match.pd8
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr101642.c17
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;
+}