[PATCH, i386]: Fix PR 91385, Zero-extended negation is not generated
Uros Bizjak
ubizjak@gmail.com
Wed Aug 7 18:44:00 GMT 2019
It looks that combine lost some of its unwanted creativity. Added
testcase will keep it that way.
2019-08-07 Uroš Bizjak <ubizjak@gmail.com>
PR target/91385
* config/i386/sse.md (*negsi2_1_zext): Simplify insn pattern.
(*negsi2_cmpz_zext): Ditto.
testsuite/ChangeLog:
2019-08-07 Uroš Bizjak <ubizjak@gmail.com>
PR target/91385
* gcc.target/i386/pr91385.c: New test.
Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.
Committed to mainline SVN.
Uros.
-------------- next part --------------
Index: config/i386/i386.md
===================================================================
--- config/i386/i386.md (revision 274169)
+++ config/i386/i386.md (working copy)
@@ -9337,13 +9337,10 @@
[(set_attr "type" "negnot")
(set_attr "mode" "<MODE>")])
-;; Combine is quite creative about this pattern.
(define_insn "*negsi2_1_zext"
[(set (match_operand:DI 0 "register_operand" "=r")
- (lshiftrt:DI
- (neg:DI (ashift:DI (match_operand:DI 1 "register_operand" "0")
- (const_int 32)))
- (const_int 32)))
+ (zero_extend:DI
+ (neg:SI (match_operand:SI 1 "register_operand" "0"))))
(clobber (reg:CC FLAGS_REG))]
"TARGET_64BIT && ix86_unary_operator_ok (NEG, SImode, operands)"
"neg{l}\t%k0"
@@ -9369,16 +9366,11 @@
(define_insn "*negsi2_cmpz_zext"
[(set (reg:CCZ FLAGS_REG)
(compare:CCZ
- (lshiftrt:DI
- (neg:DI (ashift:DI
- (match_operand:DI 1 "register_operand" "0")
- (const_int 32)))
- (const_int 32))
+ (neg:SI (match_operand:SI 1 "register_operand" "0"))
(const_int 0)))
(set (match_operand:DI 0 "register_operand" "=r")
- (lshiftrt:DI (neg:DI (ashift:DI (match_dup 1)
- (const_int 32)))
- (const_int 32)))]
+ (zero_extend:DI
+ (neg:SI (match_dup 1))))]
"TARGET_64BIT && ix86_unary_operator_ok (NEG, SImode, operands)"
"neg{l}\t%k0"
[(set_attr "type" "negnot")
@@ -9698,7 +9690,6 @@
[(set_attr "type" "negnot")
(set_attr "mode" "<MODE>")])
-;; ??? Currently never generated - xor is used instead.
(define_insn "*one_cmplsi2_1_zext"
[(set (match_operand:DI 0 "register_operand" "=r")
(zero_extend:DI
@@ -9749,7 +9740,6 @@
(set (match_dup 1)
(xor:SWI (match_dup 3) (const_int -1)))])])
-;; ??? Currently never generated - xor is used instead.
(define_insn "*one_cmplsi2_2_zext"
[(set (reg FLAGS_REG)
(compare (not:SI (match_operand:SI 1 "register_operand" "0"))
Index: testsuite/gcc.target/i386/pr91385.c
===================================================================
--- testsuite/gcc.target/i386/pr91385.c (nonexistent)
+++ testsuite/gcc.target/i386/pr91385.c (working copy)
@@ -0,0 +1,9 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2 -dp" } */
+/* { dg-final { scan-assembler-not "zero_extendsidi" } } */
+
+unsigned long long
+foo (unsigned int a)
+{
+ return -a;
+}
More information about the Gcc-patches
mailing list