forked from OSchip/llvm-project
[Hexagon] Avoid creating invalid offsets in packetizer
Two memory instructions with a dependency only on the address register between the two (the first one of them being post-incrememnt) can be packetized together after the offset on the second was updated to the incremement value. Make sure that the new offset is valid for the instruction. llvm-svn: 328897
This commit is contained in:
parent
95f9a68b1f
commit
0f983d69a4
|
@ -530,6 +530,9 @@ bool HexagonPacketizerList::updateOffset(SUnit *SUI, SUnit *SUJ) {
|
|||
return false;
|
||||
|
||||
int64_t Offset = MI.getOperand(OPI).getImm();
|
||||
if (!HII->isValidOffset(MI.getOpcode(), Offset+Incr, HRI))
|
||||
return false;
|
||||
|
||||
MI.getOperand(OPI).setImm(Offset + Incr);
|
||||
ChangedOffset = Offset;
|
||||
return true;
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
# RUN: llc -march=hexagon -run-pass hexagon-packetizer %s -o - | FileCheck %s
|
||||
|
||||
# Make sure that we don't try to packetize the two stores together. The
|
||||
# dependence on $r0 could be broken by updating the offset in the storeiri,
|
||||
# but then the offset would become invalid for that instruction (it has to
|
||||
# be a multiple of 4).
|
||||
|
||||
# CHECK: S4_storeiri_io killed renamable $r0, 0, 0
|
||||
|
||||
--- |
|
||||
define void @fred() {
|
||||
ret void
|
||||
}
|
||||
|
||||
@g0 = global i8 zeroinitializer, align 2
|
||||
@g1 = global i32 zeroinitializer, align 4
|
||||
...
|
||||
|
||||
---
|
||||
name: fred
|
||||
tracksRegLiveness: true
|
||||
body: |
|
||||
bb.0:
|
||||
successors: %bb.0, %bb.1
|
||||
liveins: $lc0, $r0, $r27
|
||||
$r1 = A2_addi $r0, 24
|
||||
$r0 = S2_storerb_pi $r0, 2, $r27 :: (store 1 into @g0, align 2)
|
||||
S4_storeiri_io killed $r0, 0, 0 :: (store 4 into @g1, align 4)
|
||||
$r0 = A2_tfr killed $r1
|
||||
ENDLOOP0 %bb.0, implicit-def $pc, implicit-def $lc0, implicit $sa0, implicit $lc0
|
||||
|
||||
bb.1:
|
||||
|
||||
...
|
Loading…
Reference in New Issue