CodeGen: More accurate mayAlias for instructions with multiple MMOs (#166211)
There can only be meaningful aliasing between the memory accesses of different instructions if at least one of the accesses modifies memory. This check is applied at the instruction-level earlier in the method. This change merely extends the check on a per-MMO basis. This affects a SystemZ test because PFD instructions are both mayLoad and mayStore but may carry a load-only MMO which is now no longer treated as aliasing loads. The PFD instructions are from llvm.prefetch generated by loop-data-prefetch.
This commit is contained in:
parent
70f5fd47a4
commit
d1387ed272
@ -1547,10 +1547,14 @@ bool MachineInstr::mayAlias(BatchAAResults *AA, const MachineInstr &Other,
|
||||
|
||||
// Check each pair of memory operands from both instructions, which can't
|
||||
// alias only if all pairs won't alias.
|
||||
for (auto *MMOa : memoperands())
|
||||
for (auto *MMOb : Other.memoperands())
|
||||
for (auto *MMOa : memoperands()) {
|
||||
for (auto *MMOb : Other.memoperands()) {
|
||||
if (!MMOa->isStore() && !MMOb->isStore())
|
||||
continue;
|
||||
if (MemOperandsHaveAlias(MFI, AA, UseTBAA, MMOa, MMOb))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -5,8 +5,8 @@
|
||||
; CHECK-LABEL: .LBB0_1:
|
||||
; CHECK-NOT: l %r
|
||||
; CHECK-NOT: vlvgf
|
||||
; CHECK: pfd
|
||||
; CHECK: vlef
|
||||
; CHECK-DAG: pfd
|
||||
; CHECK-DAG: vlef
|
||||
|
||||
%type0 = type { i32, [400 x i8], i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 }
|
||||
@Mem = external global [150 x %type0], align 4
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user