diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index af05c98c98ecfd1fa3a9ca93a44a1b786ddd29b8..1aec9adcc958b75d59f095c3e04ff34e2be3d0e5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2014-07-02  Segher Boessenkool  <segher@kernel.crashing.org>
+
+	* genconfig.c (have_rotate_flag, have_rotatert_flag): New variables.
+	(walk_insn_part) <ROTATE, ROTATERT>: New cases.
+	(main): Conditionally write HAVE_rotate resp. HAVE_rotatert.
+	* simplify-rtx.c (simplify_binary_operation_1) <ROTATE, ROTATERT>:
+	Only do the transformation if both HAVE_rotate and HAVE_rotatert.
+
 2014-07-02  Christian Bruel  <christian.bruel@st.com>
 
 	PR target/29349
diff --git a/gcc/genconfig.c b/gcc/genconfig.c
index cafa8d3040ab8bc036711479871814357dafa802..d1996c3af5da317b7835b54e3d62cfd00e6c54de 100644
--- a/gcc/genconfig.c
+++ b/gcc/genconfig.c
@@ -36,6 +36,8 @@ static int have_cc0_flag;
 static int have_cmove_flag;
 static int have_cond_exec_flag;
 static int have_lo_sum_flag;
+static int have_rotate_flag;
+static int have_rotatert_flag;
 static int have_peephole_flag;
 static int have_peephole2_flag;
 
@@ -117,6 +119,16 @@ walk_insn_part (rtx part, int recog_p, int non_pc_set_src)
 	have_lo_sum_flag = 1;
       return;
 
+    case ROTATE:
+      if (recog_p)
+	have_rotate_flag = 1;
+      return;
+
+    case ROTATERT:
+      if (recog_p)
+	have_rotatert_flag = 1;
+      return;
+
     case SET:
       walk_insn_part (SET_DEST (part), 0, recog_p);
       walk_insn_part (SET_SRC (part), recog_p,
@@ -346,6 +358,12 @@ main (int argc, char **argv)
   if (have_lo_sum_flag)
     printf ("#define HAVE_lo_sum 1\n");
 
+  if (have_rotate_flag)
+    printf ("#define HAVE_rotate 1\n");
+
+  if (have_rotatert_flag)
+    printf ("#define HAVE_rotatert 1\n");
+
   if (have_peephole_flag)
     printf ("#define HAVE_peephole 1\n");
 
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 181b56fb8c002b85fcdc528c2ff2f39d09c18878..07b93538969036b0c55e570b801e37c54a07f0a9 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -3076,6 +3076,7 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
 	 prefer left rotation, if op1 is from bitsize / 2 + 1 to
 	 bitsize - 1, use other direction of rotate with 1 .. bitsize / 2 - 1
 	 amount instead.  */
+#if defined(HAVE_rotate) && defined(HAVE_rotatert)
       if (CONST_INT_P (trueop1)
 	  && IN_RANGE (INTVAL (trueop1),
 		       GET_MODE_BITSIZE (mode) / 2 + (code == ROTATE),
@@ -3083,6 +3084,7 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
 	return simplify_gen_binary (code == ROTATE ? ROTATERT : ROTATE,
 				    mode, op0, GEN_INT (GET_MODE_BITSIZE (mode)
 							- INTVAL (trueop1)));
+#endif
       /* FALLTHRU */
     case ASHIFTRT:
       if (trueop1 == CONST0_RTX (mode))