diff mbox

Fix PR63237

Message ID alpine.LSU.2.11.1409121050360.20733@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Sept. 12, 2014, 8:51 a.m. UTC
The following fixes a missed gimplification of strlen in the
GIMPLE strlen folding variant.

Bootstrap and regtest running on x86_64-unknown-linux-gnu.

Richard.

2014-09-12  Richard Biener  <rguenther@suse.de>

	PR middle-end/63237
	* gimple-fold.c (get_maxval_strlen): Gimplify string length.

	* g++.dg/torture/pr63237.C: New testcase.
diff mbox

Patch

Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c	(revision 215203)
+++ gcc/gimple-fold.c	(working copy)
@@ -2411,6 +2411,7 @@  gimple_fold_builtin_strlen (gimple_stmt_
   tree len = get_maxval_strlen (gimple_call_arg (stmt, 0), 0);
   if (!len)
     return false;
+  len = force_gimple_operand_gsi (gsi, len, true, NULL, true, GSI_SAME_STMT);
   replace_call_with_value (gsi, len);
   return true;
 }
Index: gcc/testsuite/g++.dg/torture/pr63237.C
===================================================================
--- gcc/testsuite/g++.dg/torture/pr63237.C	(revision 0)
+++ gcc/testsuite/g++.dg/torture/pr63237.C	(working copy)
@@ -0,0 +1,21 @@ 
+// { dg-do compile }
+
+class A {
+    int Length;
+public:
+    A(const char *p1) { Length = __builtin_strlen(p1); }
+};
+class B {
+public:
+    void m_fn1(int, A);
+};
+class C {
+public:
+    B &m_fn2();
+};
+int a;
+void RewriteMacrosInInput() {
+    C b;
+    B &c = b.m_fn2();
+    c.m_fn1(0, &""[a]);
+}