File nvl423594.patch of Package gcc43
--- /space/rguenther/src/svn/gcc-4_3-branch/gcc/tree-gimple.h 2008-02-19 10:55:59.000000000 +0100
+++ gcc/tree-gimple.h 2008-09-15 12:10:46.000000000 +0200
@@ -119,6 +119,7 @@
extern void push_gimplify_context (void);
extern void pop_gimplify_context (tree);
extern void gimplify_and_add (tree, tree *);
+extern void force_gimplify_and_add (tree, tree *);
/* Miscellaneous helpers. */
extern void gimple_add_tmp_var (tree);
--- /space/rguenther/src/svn/gcc-4_3-branch/gcc/gimplify.c 2008-09-04 16:09:13.000000000 +0200
+++ gcc/gimplify.c 2008-09-15 12:58:13.000000000 +0200
@@ -6695,4 +6749,20 @@
return expr;
}
+void
+force_gimplify_and_add (tree stmt, tree *list)
+{
+ tree t;
+ push_gimplify_context ();
+ gimplify_ctxp->into_ssa = gimple_in_ssa_p (cfun);
+ gimplify_ctxp->allow_rhs_cond_expr = true;
+ gimplify_and_add (stmt, list);
+ if (gimple_referenced_vars (cfun))
+ {
+ for (t = gimplify_ctxp->temps; t ; t = TREE_CHAIN (t))
+ add_referenced_var (t);
+ }
+ pop_gimplify_context (NULL);
+}
+
#include "gt-gimplify.h"
--- /space/rguenther/src/svn/gcc-4_3-branch/gcc/tree-sra.c 2008-02-19 10:56:00.000000000 +0100
+++ gcc/tree-sra.c 2008-09-15 12:10:55.000000000 +0200
@@ -2186,7 +2186,7 @@
stmt = build_gimple_modify_stmt (stmp,
fold_build1 (VIEW_CONVERT_EXPR,
stype, var));
- append_to_statement_list (stmt, &list);
+ force_gimplify_and_add (stmt, &list);
var = stmp;
}
--- /dev/null 2008-06-06 22:36:48.000000000 +0200
+++ gcc/testsuite/gcc.c-torture/compile/nvl423594.c 2008-09-15 13:05:25.000000000 +0200
@@ -0,0 +1,16 @@
+void Deactivate(void);
+typedef struct {
+ char ctype;
+ char action;
+ short options;
+} pwdStatus_t;
+void getCredentials(char *buffer)
+{
+ pwdStatus_t SessionSt;
+ int pst = 0;
+ __builtin_memset(&SessionSt,0,sizeof(SessionSt));
+ __builtin_memcpy(&pst,buffer,sizeof(pwdStatus_t));
+ __builtin_memcpy(&SessionSt, &pst, sizeof(pwdStatus_t));
+ Deactivate();
+}
+