This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] ia64: properly drop instructions when none emitted toa bundle (because of errors)


While the change to address PR/474 properly prevents live locks, it
didn't
address some of the (pre-exisiting) follow-up problems up dropping
instructions (the new test added here did not pass).

Built and tested on ia64-unknown-linux-gnu.

Jan

gas/
2005-03-07  Jan Beulich  <jbeulich@novell.com>

	* config/tc-ia64.c (emit_one_bundle): Track last slot user insn
was
	emitted to. Add more precise diagnostics for non-fitting insns
based
	on that. Eliminate now superfluous special casing of MLX. Clear
out
	slot information when dropping an insn.

gas/testsuite/
2005-03-07  Jan Beulich  <jbeulich@novell.com>

	* gas/ia64/no-fit.[ls]: New.
	* gas/ia64/ia64.exp: Run new test.

---
/home/jbeulich/src/binutils/mainline/2005-03-07/gas/config/tc-ia64.c	2005-02-28
08:27:15.000000000 +0100
+++ 2005-03-07/gas/config/tc-ia64.c	2005-03-07 14:03:16.685965461
+0100
@@ -6480,7 +6480,7 @@ emit_one_bundle ()
   bfd_vma insn[3] = { -1, -1, -1 };
   struct ia64_opcode *idesc;
   int end_of_insn_group = 0, user_template = -1;
-  int n, i, j, first, curr;
+  int n, i, j, first, curr, last_slot;
   unw_rec_list *ptr, *last_ptr, *end_ptr;
   bfd_vma t0 = 0, t1 = 0;
   struct label_fix *lfix;
@@ -6532,6 +6532,7 @@ emit_one_bundle ()
   curr = first;
   idesc = md.slot[curr].idesc;
   end_of_insn_group = 0;
+  last_slot = -1;
   for (i = 0; i < 3 && md.num_slots_in_use > 0; ++i)
     {
       /* If we have unwind records, we may need to update some now. 
*/
@@ -6797,27 +6798,7 @@ emit_one_bundle ()
 	}
 
       if (insn_unit != required_unit)
-	{
-	  if (required_unit == IA64_UNIT_L
-	      && insn_unit == IA64_UNIT_I
-	      && !(idesc->flags & IA64_OPCODE_X_IN_MLX))
-	    {
-	      /* we got ourselves an MLX template but the current
-		 instruction isn't an X-unit, or an I-unit instruction
-		 that can go into the X slot of an MLX template.  Duh. 
*/
-	      if (md.num_slots_in_use >= NUM_SLOTS)
-		{
-		  as_bad_where (md.slot[curr].src_file,
-				md.slot[curr].src_line,
-				"`%s' can't go in X slot of "
-				"MLX template", idesc->name);
-		  /* drop this insn so we don't livelock:  */
-		  --md.num_slots_in_use;
-		}
-	      break;
-	    }
-	  continue;		/* try next slot */
-	}
+	continue;		/* Try next slot.  */
 
       if (debug_type == DEBUG_DWARF2 ||
md.slot[curr].loc_directive_seen)
 	{
@@ -6851,6 +6832,7 @@ emit_one_bundle ()
 	  ++i;
 	}
       --md.num_slots_in_use;
+      last_slot = i;
 
       /* now is a good time to fix up the labels for this insn:  */
       for (lfix = md.slot[curr].label_fixups; lfix; lfix =
lfix->next)
@@ -6895,10 +6877,35 @@ emit_one_bundle ()
     {
       if (md.num_slots_in_use > 0)
 	{
-	  as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
-			"`%s' does not fit into %s template",
-			idesc->name, ia64_templ_desc[template].name);
-	  --md.num_slots_in_use;
+	  if (last_slot >= 2)
+	    as_bad_where (md.slot[curr].src_file,
md.slot[curr].src_line,
+			  "`%s' does not fit into bundle",
idesc->name);
+	  else if (last_slot < 0)
+	    {
+	      as_bad_where (md.slot[curr].src_file,
md.slot[curr].src_line,
+			    "`%s' does not fit into %s template",
+			    idesc->name,
ia64_templ_desc[template].name);
+	      /* Drop first insn so we don't livelock.  */
+	      --md.num_slots_in_use;
+	      know (curr == first);
+	      ia64_free_opcode (md.slot[curr].idesc);
+	      memset (md.slot + curr, 0, sizeof (md.slot[curr]));
+	      md.slot[curr].user_template = -1;
+	    }
+	  else
+	    {
+	      const char *where;
+
+	      if (template == 2)
+		where = "X slot";
+	      else if (last_slot == 0)
+		where = "slots 2 or 3";
+	      else
+		where = "slot 3";
+	      as_bad_where (md.slot[curr].src_file,
md.slot[curr].src_line,
+			    "`%s' can't go in %s of %s template",
+			    idesc->name, where,
ia64_templ_desc[template].name);
+	    }
 	}
       else
 	as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
---
/home/jbeulich/src/binutils/mainline/2005-03-07/gas/testsuite/gas/ia64/ia64.exp	2005-02-28
08:27:22.000000000 +0100
+++ 2005-03-07/gas/testsuite/gas/ia64/ia64.exp	2005-03-07
13:58:08.186945803 +0100
@@ -74,6 +74,7 @@ if [istarget "ia64-*"] then {
     run_dump_test "bundling"
     run_list_test "label" ""
     run_list_test "last" ""
+    run_list_test "no-fit" ""
     run_list_test "pound" "-al"
     run_list_test "proc" "-munwind-check=error"
     run_list_test "slot2" ""
---
/home/jbeulich/src/binutils/mainline/2005-03-07/gas/testsuite/gas/ia64/no-fit.l	1970-01-01
01:00:00.000000000 +0100
+++ 2005-03-07/gas/testsuite/gas/ia64/no-fit.l	2005-03-07
13:15:42.000000000 +0100
@@ -0,0 +1,8 @@
+.*: Assembler messages:
+.*:5: Error: .nop\.i.[[:space:]]+[^23]*[[:space:]]+MFB[[:space:]]+.*
+.*:8: Error: .nop\.f.[[:space:]]+[^23]*[[:space:]]+MLX[[:space:]]+.*
+.*:12: Error:
.nop\.i.[[:space:]]+.*[[:space:]]+2[[:space:]]+.*[[:space:]]+3[[:space:]]+.*[[:space:]]+MFB[[:space:]]+.*
+.*:17: Error:
.nop\.i.[[:space:]]+[^2]*[[:space:]]+3[[:space:]]+.*[[:space:]]+MFB[[:space:]]+.*
+.*:21: Error:
.nop\.f.[[:space:]]+.*[[:space:]]+X[[:space:]]+.*[[:space:]]+MLX[[:space:]]+.*
+.*:27: Error: .nop.[[:space:]]+[^23M]*
+.*:32: Error: .nop.[[:space:]]+[^23M]*
---
/home/jbeulich/src/binutils/mainline/2005-03-07/gas/testsuite/gas/ia64/no-fit.s	1970-01-01
01:00:00.000000000 +0100
+++ 2005-03-07/gas/testsuite/gas/ia64/no-fit.s	2005-03-07
13:05:37.000000000 +0100
@@ -0,0 +1,33 @@
+.explicit
+.text
+_start:
+{.mfb
+	nop.i	0
+}
+{.mlx
+	nop.f	0
+}
+{.mfb
+	nop.m	0
+	nop.i	0
+}
+{.mfb
+	nop.m	0
+	nop.f	0
+	nop.i	0
+}
+{.mlx
+	nop.m	0
+	nop.f	0
+}
+{.mfb
+	nop	0
+	nop	0
+	nop	0
+	nop	0
+}
+{.mlx
+	nop	0
+	nop	0
+	nop	0
+}

Attachment: binutils-mainline-ia64-no-fit.patch
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]