diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-04-03 11:49:10 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-04-03 11:49:29 -0700 |
commit | bbcdf9bb3fd04adc59f41e4e1ff6293c84cbecc4 (patch) | |
tree | 5c1ef890db487b0e125329f83bdff7c4a856315d /gcc/config/i386 | |
parent | b949f8e2acb49273b2f08ecaa3bc7128baaad850 (diff) | |
download | gcc-bbcdf9bb3fd04adc59f41e4e1ff6293c84cbecc4.tar.gz |
x86: Mark scratch operand in ssse3_pshufbv8qi3 as earlyclobber
commit 16ed2601ad0a4aa82f11e9df86ea92183f94f979
Author: H.J. Lu <hongjiu.lu@intel.com>
Date: Wed May 15 15:26:19 2019 +0000
i386: Emulate MMX pshufb with SSE version
has
+(define_insn_and_split "ssse3_pshufbv8qi3"
+ [(set (match_operand:V8QI 0 "register_operand" "=y,x,Yv")
+ (unspec:V8QI [(match_operand:V8QI 1 "register_operand" "0,0,Yv")
+ (match_operand:V8QI 2 "register_mmxmem_operand" "ym,x,Yv")]
+ UNSPEC_PSHUFB))
+ (clobber (match_scratch:V4SI 3 "=X,x,Yv"))]
^^^ There are earlyclobber.
+ "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSSE3"
+ "@
+ pshufb\t{%2, %0|%0, %2}
+ #
+ #"
+ "TARGET_MMX_WITH_SSE && reload_completed"
+ [(set (match_dup 3) (match_dup 5))
+ (set (match_dup 3)
+ (and:V4SI (match_dup 3) (match_dup 2)))
+ (set (match_dup 0)
+ (unspec:V16QI [(match_dup 1) (match_dup 4)] UNSPEC_PSHUFB))]
If input register operand 2 is dead after this insn, RA may choose it
as scratch operand. Since it isn't marked as earlyclobber, operand 2
becomes unused after split and then it gets optimized out. Mark scratch
operand as earlyclobber fixes the issue.
gcc/
PR target/94467
* config/i386/sse.md (ssse3_pshufbv8qi3): Mark scratch operand
as earlyclobber.
gcc/testsuite/
PR target/94467
* gcc.target/i386/pr94467-1.c: New test.
* gcc.target/i386/pr94467-2.c: Likewise.
Diffstat (limited to 'gcc/config/i386')
-rw-r--r-- | gcc/config/i386/sse.md | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 24b3acd163e..fef6065b687 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -16695,7 +16695,7 @@ (unspec:V8QI [(match_operand:V8QI 1 "register_operand" "0,0,Yv") (match_operand:V8QI 2 "register_mmxmem_operand" "ym,x,Yv")] UNSPEC_PSHUFB)) - (clobber (match_scratch:V4SI 3 "=X,x,Yv"))] + (clobber (match_scratch:V4SI 3 "=X,&x,&Yv"))] "(TARGET_MMX || TARGET_MMX_WITH_SSE) && TARGET_SSSE3" "@ pshufb\t{%2, %0|%0, %2} |