This is a regression present on all active branches. The first pattern added
by http://gcc.gnu.org/ml/gcc-patches/2011-10/msg00060.html is wrong since, as
counter-intuitive as it may seem, "sll" also does a full 64-bit shift.
Tested on SPARC/Solaris, applied on all active branches.
2014-04-25 Eric Botcazou <ebotca...@adacore.com>
PR target/60941
* config/sparc/sparc.md (ashlsi3_extend): Delete.
2014-04-25 Eric Botcazou <ebotca...@adacore.com>
* gcc.c-torture/execute/20140425-1.c: New test.
--
Eric Botcazou
Index: config/sparc/sparc.md
===================================================================
--- config/sparc/sparc.md (revision 209778)
+++ config/sparc/sparc.md (working copy)
@@ -5795,19 +5795,6 @@ (define_insn "ashlsi3"
}
[(set_attr "type" "shift")])
-(define_insn "*ashlsi3_extend"
- [(set (match_operand:DI 0 "register_operand" "=r")
- (zero_extend:DI
- (ashift:SI (match_operand:SI 1 "register_operand" "r")
- (match_operand:SI 2 "arith_operand" "rI"))))]
- "TARGET_ARCH64"
-{
- if (GET_CODE (operands[2]) == CONST_INT)
- operands[2] = GEN_INT (INTVAL (operands[2]) & 0x1f);
- return "sll\t%1, %2, %0";
-}
- [(set_attr "type" "shift")])
-
(define_expand "ashldi3"
[(set (match_operand:DI 0 "register_operand" "=r")
(ashift:DI (match_operand:DI 1 "register_operand" "r")
/* PR target/60941 */
/* Reported by Martin Husemann <mar...@netbsd.org> */
extern void abort (void);
static void __attribute__((noinline))
set (unsigned long *l)
{
*l = 31;
}
int main (void)
{
unsigned long l;
int i;
set (&l);
i = (int) l;
l = (unsigned long)(2U << i);
if (l != 0)
abort ();
return 0;
}