mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
Consistently use MemoryLocation::UnknownSize to indicate unknown access size
1. Change the software pipeliner to use unknown size instead of dropping memory operands. It used to do it before, but MachineInstr::mayAlias did not handle it correctly. 2. Recognize UnknownSize in MachineInstr::mayAlias. 3. Print and parse UnknownSize in MIR. Differential Revision: https://reviews.llvm.org/D50339 llvm-svn: 340208
This commit is contained in:
parent
ec2bc69447
commit
19f420fde1
@ -247,6 +247,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) {
|
||||
.Case("intpred", MIToken::kw_intpred)
|
||||
.Case("pre-instr-symbol", MIToken::kw_pre_instr_symbol)
|
||||
.Case("post-instr-symbol", MIToken::kw_post_instr_symbol)
|
||||
.Case("unknown-size", MIToken::kw_unknown_size)
|
||||
.Default(MIToken::Identifier);
|
||||
}
|
||||
|
||||
|
@ -115,6 +115,7 @@ struct MIToken {
|
||||
kw_intpred,
|
||||
kw_pre_instr_symbol,
|
||||
kw_post_instr_symbol,
|
||||
kw_unknown_size,
|
||||
|
||||
// Named metadata keywords
|
||||
md_tbaa,
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/Analysis/MemoryLocation.h"
|
||||
#include "llvm/AsmParser/Parser.h"
|
||||
#include "llvm/AsmParser/SlotMapping.h"
|
||||
#include "llvm/CodeGen/MIRPrinter.h"
|
||||
@ -2452,7 +2453,7 @@ bool MIParser::parseOptionalAtomicOrdering(AtomicOrdering &Order) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return error("expected an atomic scope, ordering or a size integer literal");
|
||||
return error("expected an atomic scope, ordering or a size specification");
|
||||
}
|
||||
|
||||
bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {
|
||||
@ -2491,11 +2492,17 @@ bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {
|
||||
if (parseOptionalAtomicOrdering(FailureOrder))
|
||||
return true;
|
||||
|
||||
if (Token.isNot(MIToken::IntegerLiteral))
|
||||
return error("expected the size integer literal after memory operation");
|
||||
if (Token.isNot(MIToken::IntegerLiteral) &&
|
||||
Token.isNot(MIToken::kw_unknown_size))
|
||||
return error("expected the size integer literal or 'unknown-size' after "
|
||||
"memory operation");
|
||||
uint64_t Size;
|
||||
if (getUint64(Size))
|
||||
return true;
|
||||
if (Token.is(MIToken::IntegerLiteral)) {
|
||||
if (getUint64(Size))
|
||||
return true;
|
||||
} else if (Token.is(MIToken::kw_unknown_size)) {
|
||||
Size = MemoryLocation::UnknownSize;
|
||||
}
|
||||
lex();
|
||||
|
||||
MachinePointerInfo Ptr = MachinePointerInfo();
|
||||
@ -2512,7 +2519,7 @@ bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {
|
||||
if (parseMachinePointerInfo(Ptr))
|
||||
return true;
|
||||
}
|
||||
unsigned BaseAlignment = Size;
|
||||
unsigned BaseAlignment = (Size != MemoryLocation::UnknownSize ? Size : 1);
|
||||
AAMDNodes AAInfo;
|
||||
MDNode *Range = nullptr;
|
||||
while (consumeIfPresent(MIToken::comma)) {
|
||||
|
@ -1179,10 +1179,13 @@ bool MachineInstr::mayAlias(AliasAnalysis *AA, MachineInstr &Other,
|
||||
|
||||
int64_t OffsetA = MMOa->getOffset();
|
||||
int64_t OffsetB = MMOb->getOffset();
|
||||
|
||||
int64_t MinOffset = std::min(OffsetA, OffsetB);
|
||||
int64_t WidthA = MMOa->getSize();
|
||||
int64_t WidthB = MMOb->getSize();
|
||||
|
||||
uint64_t WidthA = MMOa->getSize();
|
||||
uint64_t WidthB = MMOb->getSize();
|
||||
bool KnownWidthA = WidthA != MemoryLocation::UnknownSize;
|
||||
bool KnownWidthB = WidthB != MemoryLocation::UnknownSize;
|
||||
|
||||
const Value *ValA = MMOa->getValue();
|
||||
const Value *ValB = MMOb->getValue();
|
||||
bool SameVal = (ValA && ValB && (ValA == ValB));
|
||||
@ -1198,6 +1201,8 @@ bool MachineInstr::mayAlias(AliasAnalysis *AA, MachineInstr &Other,
|
||||
}
|
||||
|
||||
if (SameVal) {
|
||||
if (!KnownWidthA || !KnownWidthB)
|
||||
return true;
|
||||
int64_t MaxOffset = std::max(OffsetA, OffsetB);
|
||||
int64_t LowWidth = (MinOffset == OffsetA) ? WidthA : WidthB;
|
||||
return (MinOffset + LowWidth > MaxOffset);
|
||||
@ -1212,13 +1217,15 @@ bool MachineInstr::mayAlias(AliasAnalysis *AA, MachineInstr &Other,
|
||||
assert((OffsetA >= 0) && "Negative MachineMemOperand offset");
|
||||
assert((OffsetB >= 0) && "Negative MachineMemOperand offset");
|
||||
|
||||
int64_t Overlapa = WidthA + OffsetA - MinOffset;
|
||||
int64_t Overlapb = WidthB + OffsetB - MinOffset;
|
||||
int64_t OverlapA = KnownWidthA ? WidthA + OffsetA - MinOffset
|
||||
: MemoryLocation::UnknownSize;
|
||||
int64_t OverlapB = KnownWidthB ? WidthB + OffsetB - MinOffset
|
||||
: MemoryLocation::UnknownSize;
|
||||
|
||||
AliasResult AAResult = AA->alias(
|
||||
MemoryLocation(ValA, Overlapa,
|
||||
MemoryLocation(ValA, OverlapA,
|
||||
UseTBAA ? MMOa->getAAInfo() : AAMDNodes()),
|
||||
MemoryLocation(ValB, Overlapb,
|
||||
MemoryLocation(ValB, OverlapB,
|
||||
UseTBAA ? MMOb->getAAInfo() : AAMDNodes()));
|
||||
|
||||
return (AAResult != NoAlias);
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "llvm/CodeGen/MachineOperand.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/Analysis/Loads.h"
|
||||
#include "llvm/Analysis/MemoryLocation.h"
|
||||
#include "llvm/CodeGen/MIRPrinter.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
||||
@ -1078,7 +1079,11 @@ void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,
|
||||
if (getFailureOrdering() != AtomicOrdering::NotAtomic)
|
||||
OS << toIRString(getFailureOrdering()) << ' ';
|
||||
|
||||
OS << getSize();
|
||||
if (getSize() == MemoryLocation::UnknownSize)
|
||||
OS << "unknown-size";
|
||||
else
|
||||
OS << getSize();
|
||||
|
||||
if (const Value *Val = getValue()) {
|
||||
OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into ");
|
||||
printIRValueReference(OS, *Val, MST);
|
||||
|
@ -3190,8 +3190,8 @@ void SwingSchedulerDAG::updateMemOperands(MachineInstr &NewMI,
|
||||
NewMMOs.push_back(
|
||||
MF.getMachineMemOperand(MMO, AdjOffset, MMO->getSize()));
|
||||
} else {
|
||||
NewMI.dropMemRefs(MF);
|
||||
return;
|
||||
NewMMOs.push_back(
|
||||
MF.getMachineMemOperand(MMO, 0, MemoryLocation::UnknownSize));
|
||||
}
|
||||
}
|
||||
NewMI.setMemRefs(MF, NewMMOs);
|
||||
|
@ -17,7 +17,7 @@ liveins:
|
||||
body: |
|
||||
bb.0.entry:
|
||||
liveins: $rdi
|
||||
; CHECK: [[@LINE+1]]:53: expected an atomic scope, ordering or a size integer literal
|
||||
; CHECK: [[@LINE+1]]:53: expected an atomic scope, ordering or a size specification
|
||||
$eax = MOV32rm killed $rdi, 1, _, 0, _ :: (load from %ir.a)
|
||||
RETQ $eax
|
||||
...
|
||||
|
@ -0,0 +1,24 @@
|
||||
# RUN: not llc -march=x86-64 -run-pass none -o /dev/null %s 2>&1 | FileCheck %s
|
||||
|
||||
--- |
|
||||
|
||||
define i32 @test(i32* %a) {
|
||||
entry:
|
||||
%b = load i32, i32* %a
|
||||
ret i32 %b
|
||||
}
|
||||
|
||||
...
|
||||
---
|
||||
name: test
|
||||
tracksRegLiveness: true
|
||||
liveins:
|
||||
- { reg: '$rdi' }
|
||||
body: |
|
||||
bb.0.entry:
|
||||
liveins: $rdi
|
||||
; CHECK: [[@LINE+1]]:53: expected the size integer literal or 'unknown-size' after memory operation
|
||||
$eax = MOV32rm killed $rdi, 1, _, 0, _ :: (load . from %ir.a)
|
||||
RETQ $eax
|
||||
...
|
||||
|
@ -189,6 +189,8 @@
|
||||
|
||||
define void @dummy0() { ret void }
|
||||
define void @dummy1() { ret void }
|
||||
define void @dummy2() { ret void }
|
||||
define void @dummy3() { ret void }
|
||||
...
|
||||
---
|
||||
name: test
|
||||
@ -532,5 +534,30 @@ body: |
|
||||
bb.0:
|
||||
$rax = MOV64rm $rsp, 1, _, 0, _ :: (load 8 from %stack.0)
|
||||
RETQ $rax
|
||||
|
||||
...
|
||||
---
|
||||
# Test parsing of unknown size in machine memory operands without alignment.
|
||||
# CHECK-LABEL: name: dummy2
|
||||
# CHECK: $rax = MOV64rm $rsp, 1, $noreg, 0, $noreg :: (load unknown-size from %stack.0, align 1)
|
||||
name: dummy2
|
||||
tracksRegLiveness: true
|
||||
stack:
|
||||
- { id: 0, size: 4, alignment: 4 }
|
||||
body: |
|
||||
bb.0:
|
||||
$rax = MOV64rm $rsp, 1, _, 0, _ :: (load unknown-size from %stack.0)
|
||||
RETQ $rax
|
||||
...
|
||||
---
|
||||
# Test parsing of unknown size in machine memory operands with alignment.
|
||||
# CHECK-LABEL: name: dummy3
|
||||
# CHECK: $rax = MOV64rm $rsp, 1, $noreg, 0, $noreg :: (load unknown-size from %stack.0, align 4)
|
||||
name: dummy3
|
||||
tracksRegLiveness: true
|
||||
stack:
|
||||
- { id: 0, size: 4, alignment: 4 }
|
||||
body: |
|
||||
bb.0:
|
||||
$rax = MOV64rm $rsp, 1, _, 0, _ :: (load unknown-size from %stack.0, align 4)
|
||||
RETQ $rax
|
||||
...
|
||||
|
Loading…
Reference in New Issue
Block a user