diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c
index 02e1113..4e7069e 100644
--- a/gcc/tree-tailcall.c
+++ b/gcc/tree-tailcall.c
@@ -329,8 +329,10 @@ process_assignment (gimple stmt, gimple_stmt_iterator call, tree *m,
     case NEGATE_EXPR:
       if (FLOAT_TYPE_P (TREE_TYPE (op0)))
         *m = build_real (TREE_TYPE (op0), dconstm1);
+      else if (INTEGRAL_TYPE_P (TREE_TYPE (non_ass_var)))
+        *m = build_int_cst (TREE_TYPE (non_ass_var), -1);
       else
-        *m = build_int_cst (TREE_TYPE (op0), -1);
+        *m = fold_build1 (NEGATE_EXPR, TREE_TYPE (non_ass_var), non_ass_var);
 
       *ass_var = dest;
       return true;
@@ -342,8 +344,10 @@ process_assignment (gimple stmt, gimple_stmt_iterator call, tree *m,
         {
           if (FLOAT_TYPE_P (TREE_TYPE (non_ass_var)))
             *m = build_real (TREE_TYPE (non_ass_var), dconstm1);
-          else
+          else if (INTEGRAL_TYPE_P (TREE_TYPE (non_ass_var)))
             *m = build_int_cst (TREE_TYPE (non_ass_var), -1);
+          else
+            *m = fold_build1 (NEGATE_EXPR, TREE_TYPE (non_ass_var), non_ass_var);
 
           *a = fold_build1 (NEGATE_EXPR, TREE_TYPE (non_ass_var), non_ass_var);
         }