On 01/09/11 16:26, Andrew Stubbs wrote:
OK, fair enough, redundant or not, here's a patch with belt and braces.
OK now?
And again, with the patch ....
Andrew
2011-09-01 Andrew Stubbs <a...@codesourcery.com>
gcc/
* config/arm/predicates.md (shift_amount_operand): Ensure shift
amount is in the range 1..mode_size-1.
gcc/testsuite/
* gcc.dg/pr50193-1.c: New file.
--- a/gcc/config/arm/predicates.md
+++ b/gcc/config/arm/predicates.md
@@ -132,7 +132,9 @@
(define_predicate "shift_amount_operand"
(ior (and (match_test "TARGET_ARM")
(match_operand 0 "s_register_operand"))
- (match_operand 0 "const_int_operand")))
+ (and (match_operand 0 "const_int_operand")
+ (match_test "INTVAL (op) > 0
+ && INTVAL (op) <= GET_MODE_PRECISION (mode)"))))
(define_predicate "arm_add_operand"
(ior (match_operand 0 "arm_rhs_operand")
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr50193-1.c
@@ -0,0 +1,10 @@
+/* PR 50193: ARM: ICE on a | (b << negative-constant) */
+/* Ensure that the compiler doesn't ICE. */
+
+/* { dg-options "-O2" } */
+
+int
+foo(int a, int b)
+{
+ return a | (b << -3); /* { dg-warning "left shift count is negative" } */
+}