[lld] ddf1fb1 - [Hexagon] Save results from partial compound

Krzysztof Parzyszek via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 6 14:09:06 PST 2022


Author: Brian Cain
Date: 2022-01-06T14:08:33-08:00
New Revision: ddf1fb1f133a0f98d604551e3381b2328bed877f

URL: https://github.com/llvm/llvm-project/commit/ddf1fb1f133a0f98d604551e3381b2328bed877f
DIFF: https://github.com/llvm/llvm-project/commit/ddf1fb1f133a0f98d604551e3381b2328bed877f.diff

LOG: [Hexagon] Save results from partial compound

Previously compounding was all-or-nothing.  Now, the
compounding attempts will iterate and yield the most
compounds that still result in a valid packet.

Added: 
    llvm/test/MC/Hexagon/bug_28748.s

Modified: 
    lld/test/ELF/hexagon.s
    llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp

Removed: 
    


################################################################################
diff  --git a/lld/test/ELF/hexagon.s b/lld/test/ELF/hexagon.s
index 394e6f00600bf..fee7ccd4f1ca3 100644
--- a/lld/test/ELF/hexagon.s
+++ b/lld/test/ELF/hexagon.s
@@ -4,153 +4,153 @@
 # RUN: ld.lld %t.o %t1.o -o %t
 # RUN: llvm-objdump -d %t | FileCheck %s
 
-# Note: 131648 == 0x20240
+# Note: 131584 == 0x20200
 # R_HEX_32_6_X
 # R_HEX_12_X
 if (p0) r0 = ##_start
-# CHECK: immext(#131648)
-# CHECK: if (p0) r0 = ##131648
+# CHECK: immext(#131584)
+# CHECK: if (p0) r0 = ##131644
 
 # R_HEX_B15_PCREL
 if (p0) jump:nt #_start
-# CHECK: if (p0) jump:nt 0x20240
+# CHECK: if (p0) jump:nt 0x2023c
 
 # R_HEX_B32_PCREL_X
 # R_HEX_B15_PCREL_X
 if (p0) jump:nt ##_start
-# CHECK: if (p0) jump:nt 0x20240
+# CHECK: if (p0) jump:nt 0x2023c
 
 # R_HEX_B22_PCREL
 call #_start
-# CHECK: call 0x20240
+# CHECK: call 0x2023c
 
 # R_HEX_B32_PCREL_X
 # R_HEX_B22_PCREL_X
 call ##_start
 # CHECK: immext(#320)
-# CHECK: call 0x20240
+# CHECK: call 0x2023c
 
 # R_HEX_6_X tests:
 # One test for each mask in the lookup table.
 
 #0x38000000
 if (!P0) memw(r0+#8)=##_start
-# CHECK: 38c0c100   	if (!p0) memw(r0+#8) = ##131648 }
+# CHECK: 38c0e11c   	if (!p0) memw(r0+#8) = ##131644 }
 
 #0x39000000
 { p0 = p1
   if (!P0.new) memw(r0+#0)=##_start }
-# CHECK: 39c0c000   	if (!p0.new) memw(r0+#0) = ##131648 }
+# CHECK: 39c0e01c   	if (!p0.new) memw(r0+#0) = ##131644 }
 
 #0x3e000000
 memw(r0+##_start)+=r1
-# CHECK: 3e40c001   	memw(r0+##131648) += r1 }
+# CHECK: 3e40de01   	memw(r0+##131644) += r1 }
 
 #0x3f000000
 memw(r0+##_start)+=#4
-# CHECK: 3f40c004   	memw(r0+##131648) += #4 }
+# CHECK: 3f40de04   	memw(r0+##131644) += #4 }
 
 #0x40000000
 { r0 = r1
   if (p0) memb(r0+##_start)=r0.new }
-# CHECK: 40a0c200   	if (p0) memb(r0+##131648) = r0.new }
+# CHECK: 40a0e2e0   	if (p0) memb(r0+##131644) = r0.new }
 
 #0x41000000
 if (p0) r0=memb(r1+##_start)
-# CHECK: 4101c000   	if (p0) r0 = memb(r1+##131648) }
+# CHECK: 4101c780   	if (p0) r0 = memb(r1+##131644) }
 
 #0x42000000
 { r0 = r1
   p0 = p1
   if (p0.new) memb(r0+##_start)=r0.new }
-# CHECK: 42a0c200   	if (p0.new) memb(r0+##131648) = r0.new }
+# CHECK: 42a0e2e0   	if (p0.new) memb(r0+##131644) = r0.new }
 
 #0x43000000
 { p0 = p1
  if (P0.new) r0=memb(r0+##_start) }
-# CHECK: 4300c000   	if (p0.new) r0 = memb(r0+##131648) }
+# CHECK: 4300c780   	if (p0.new) r0 = memb(r0+##131644) }
 
 #0x44000000
 if (!p0) memb(r0+##_start)=r1
-# CHECK: 4400c100   	if (!p0) memb(r0+##131648) = r1 }
+# CHECK: 4400e1e0   	if (!p0) memb(r0+##131644) = r1 }
 
 #0x45000000
 if (!p0) r0=memb(r1+##_start)
-# CHECK: 4501c000   	if (!p0) r0 = memb(r1+##131648) }
+# CHECK: 4501c780   	if (!p0) r0 = memb(r1+##131644) }
 
 #0x46000000
 { p0 = p1
   if (!p0.new) memb(r0+##_start)=r1 }
-# CHECK: 4600c100   	if (!p0.new) memb(r0+##131648) = r1 }
+# CHECK: 4600e1e0   	if (!p0.new) memb(r0+##131644) = r1 }
 
 #0x47000000
 { p0 = p1
   if (!p0.new) r0=memb(r1+##_start) }
-# CHECK: 4701c000   	if (!p0.new) r0 = memb(r1+##131648) }
+# CHECK: 4701c780   	if (!p0.new) r0 = memb(r1+##131644) }
 
 #0x6a000000 -- Note 4294967132 == -0xa4 the distance between
 #              here and _start, so this will change if
 #              tests are added between here and _start
 r0=add(pc,##_start at pcrel)
-# CHECK: 6a49d800  	r0 = add(pc,##240) }
+# CHECK: 6a49d600  	r0 = add(pc,##236) }
 
 #0x7c000000
 r1:0=combine(#8,##_start)
-# CHECK: 7c80c100   	r1:0 = combine(#8,##131648) }
+# CHECK: 7c9ec100   	r1:0 = combine(#8,##131644) }
 
 #0x9a000000
 r1:0=memb_fifo(r2=##_start)
-# CHECK: 9a82d000   	r1:0 = memb_fifo(r2=##131648) }
+# CHECK: 9a82df00   	r1:0 = memb_fifo(r2=##131644) }
 
 #0x9b000000
 r0=memb(r1=##_start)
-# CHECK: 9b01d000   	r0 = memb(r1=##131648) }
+# CHECK: 9b01df00   	r0 = memb(r1=##131644) }
 
 #0x9c000000
 r1:0=memb_fifo(r2<<#2+##_start)
-# CHECK: 9c82f000   	r1:0 = memb_fifo(r2<<#2+##131648) }
+# CHECK: 9c82ff00   	r1:0 = memb_fifo(r2<<#2+##131644) }
 
 #0x9d000000
 r0=memb(r1<<#2+##_start)
-# CHECK: 9d01f000   	r0 = memb(r1<<#2+##131648) }
+# CHECK: 9d01ff00   	r0 = memb(r1<<#2+##131644) }
 
 #0x9f000000
 if (!p0) r0=memb(##_start)
-# CHECK: 9f00e880   	if (!p0) r0 = memb(##131648) }
+# CHECK: 9f1ee880   	if (!p0) r0 = memb(##131644) }
 
 #0xab000000
 memb(r0=##_start)=r1
-# CHECK: ab00c180   	memb(r0=##131648) = r1 }
+# CHECK: ab00c1bc   	memb(r0=##131644) = r1 }
 
 #0xad000000
 memb(r0<<#2+##_start)=r1
-# CHECK: ad00e180   	memb(r0<<#2+##131648) = r1 }
+# CHECK: ad00e1bc   	memb(r0<<#2+##131644) = r1 }
 
 #0xaf000000
 if (!p0) memb(##_start)=r1
-# CHECK: af00c184   	if (!p0) memb(##131648) = r1 }
+# CHECK: af03c1e4   	if (!p0) memb(##131644) = r1 }
 
 #0xd7000000
 r0=add(##_start,mpyi(r1,r2))
-# CHECK: d701c200   	r0 = add(##131648,mpyi(r1,r2)) }
+# CHECK: d761e280   	r0 = add(##131644,mpyi(r1,r2)) }
 
 #0xd8000000
 R0=add(##_start,mpyi(r0,#2))
-# CHECK: d800c002   	r0 = add(##131648,mpyi(r0,#2)) }
+# CHECK: d860e082   	r0 = add(##131644,mpyi(r0,#2)) }
 
 #0xdb000000
 r0=add(r1,add(r2,##_start))
-# CHECK: db01c002   	r0 = add(r1,add(r2,##131648)) }
+# CHECK: db61e082   	r0 = add(r1,add(r2,##131644)) }
 
 #0xdf000000
 r0=add(r1,mpyi(r2,##_start))
-# CHECK: df82c001   	r0 = add(r1,mpyi(r2,##131648)) }
+# CHECK: dfe2e081   	r0 = add(r1,mpyi(r2,##131644)) }
 
 # Duplex form of R_HEX_6_X
 # R_HEX_32_6_X
 # R_HEX_6_X
 { r0 = ##_start; r2 = r16 }
-# CHECK: 28003082   	r0 = ##131648; 	r2 = r16 }
+# CHECK: 2bc03082   	r0 = ##131644; 	r2 = r16 }
 
 # R_HEX_HI16
 r0.h = #HI(_start)
@@ -158,66 +158,66 @@ r0.h = #HI(_start)
 
 # R_HEX_LO16
 r0.l = #LO(_start)
-# CHECK: r0.l = #576
+# CHECK: r0.l = #572
 
 # R_HEX_8_X has 3 relocation mask variations
 #0xde000000
 r0=sub(##_start, asl(r0, #1))
-# CHECK: de40c106      r0 = sub(##131648,asl(r0,#1)) }
+# CHECK: de20e1c6      r0 = sub(##131644,asl(r0,#1)) }
 
 #0x3c000000
 memw(r0+#0) = ##_start
-# CHECK: 3c40c040   	memw(r0+#0) = ##131648 }
+# CHECK: 3c40c03c   	memw(r0+#0) = ##131644 }
 
 # The rest:
 r1:0=combine(r2,##_start);
-# CHECK: 7302e800   	r1:0 = combine(r2,##131648) }
+# CHECK: 7302e780   	r1:0 = combine(r2,##131644) }
 
 # R_HEX_32:
 r_hex_32:
 .word _start
-# CHECK: 00020240
+# CHECK: 0002023c
 
 # R_HEX_16_X has 4 relocation mask variations
 # 0x48000000
 memw(##_start) = r0
-# CHECK: 4880c000   memw(##131648) = r0 }
+# CHECK: 4880c03c   memw(##131644) = r0 }
 
 # 0x49000000
 r0 = memw(##_start)
-# CHECK: 4980c000   r0 = memw(##131648)
+# CHECK: 4980c780   r0 = memw(##131644)
 
 # 0x78000000
 r0 = ##_start
-# CHECK: 7800c000   r0 = ##131648 }
+# CHECK: 7800c780   r0 = ##131644 }
 
 # 0xb0000000
 r0 = add(r1, ##_start)
-# CHECK: b001c000   r0 = add(r1,##131648) }
+# CHECK: b001c780   r0 = add(r1,##131644) }
 
 # R_HEX_B9_PCREL:
 {r0=#1 ; jump #_start}
-# CHECK: jump 0x20240
+# CHECK: jump 0x2023c
 
 # R_HEX_B9_PCREL_X:
 {r0=#1 ; jump ##_start}
-# CHECK: jump 0x20240
+# CHECK: jump 0x2023c
 
 # R_HEX_B13_PCREL
 if (r0 == #0) jump:t #_start
-# CHECK: if (r0==#0) jump:t 0x20240
+# CHECK: if (r0==#0) jump:t 0x2023c
 
 # R_HEX_9_X
 p0 = !cmp.gtu(r0, ##_start)
-# CHECK: p0 = !cmp.gtu(r0,##131648)
+# CHECK: p0 = !cmp.gtu(r0,##131644)
 
 # R_HEX_10_X
 p0 = !cmp.gt(r0, ##_start)
-# CHECK: p0 = !cmp.gt(r0,##131648)
+# CHECK: p0 = !cmp.gt(r0,##131644)
 
 # R_HEX_11_X
 r0 = memw(r1+##_start)
-# CHECK: r0 = memw(r1+##131648)
+# CHECK: r0 = memw(r1+##131644)
 
 memw(r0+##_start) = r1
-# CHECK: memw(r0+##131648) = r1
+# CHECK: memw(r0+##131644) = r1

diff  --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp
index e7ade7834a9f4..4bb078fb7ecb5 100644
--- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp
+++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp
@@ -405,24 +405,27 @@ void HexagonMCInstrInfo::tryCompound(MCInstrInfo const &MCII, MCSubtargetInfo co
   if (MCI.size() < 2)
     return;
 
-  bool StartedValid = llvm::HexagonMCShuffle(Context, false, MCII, STI, MCI);
-
   // Create a vector, needed to keep the order of jump instructions.
   MCInst CheckList(MCI);
 
+  // Keep the last known good bundle around in case the shuffle fails.
+  MCInst LastValidBundle(MCI);
+
+  bool PreviouslyValid = llvm::HexagonMCShuffle(Context, false, MCII, STI, MCI);
+
   // Look for compounds until none are found, only update the bundle when
   // a compound is found.
   while (lookForCompound(MCII, Context, CheckList)) {
-    // Keep the original bundle around in case the shuffle fails.
-    MCInst OriginalBundle(MCI);
-
     // Need to update the bundle.
     MCI = CheckList;
 
-    if (StartedValid &&
-        !llvm::HexagonMCShuffle(Context, false, MCII, STI, MCI)) {
+    const bool IsValid = llvm::HexagonMCShuffle(Context, false, MCII, STI, MCI);
+    if (PreviouslyValid && !IsValid) {
       LLVM_DEBUG(dbgs() << "Found ERROR\n");
-      MCI = OriginalBundle;
+      MCI = LastValidBundle;
+    } else if (IsValid) {
+      LastValidBundle = MCI;
+      PreviouslyValid = true;
     }
   }
 }

diff  --git a/llvm/test/MC/Hexagon/bug_28748.s b/llvm/test/MC/Hexagon/bug_28748.s
new file mode 100644
index 0000000000000..05522f0d1d036
--- /dev/null
+++ b/llvm/test/MC/Hexagon/bug_28748.s
@@ -0,0 +1,19 @@
+# RUN: llvm-mc -arch=hexagon -mcpu=hexagonv65 -filetype=obj %s | llvm-objdump --mcpu=hexagonv65 -d - | FileCheck --implicit-check-not='{' %s
+
+# This case requires compounding only some of the instructions which are
+# possible compounds.  Compounding all possible opcodes is ideal for code size
+# but does not always result in a packet with a valid shuffle, whereas the
+# non-compounded instructions may be a valid shuffle.
+
+foo:
+{ r0=c0
+  p0=cmp.eq(r0,#0); if (p0.new) jump:nt foo
+  jump foo
+  r1=r0 }
+
+# CHECK-LABEL:  <foo>:
+# CHECK-NEXT:  { r0 = sa0
+# CHECK-NEXT:    p0 = cmp.eq(r0,#0); if (p0.new) jump:nt 0x0
+# CHECK-NEXT:    jump 0x0
+# CHECK-NEXT:    r1 = r0 }
+


        


More information about the llvm-commits mailing list