Skip to content

Commit cc3f630

Browse files
author
Krzysztof Parzyszek
committedAug 20, 2018
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
1 parent 2077b62 commit cc3f630

9 files changed

+90
-18
lines changed
 

‎llvm/lib/CodeGen/MIRParser/MILexer.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) {
247247
.Case("intpred", MIToken::kw_intpred)
248248
.Case("pre-instr-symbol", MIToken::kw_pre_instr_symbol)
249249
.Case("post-instr-symbol", MIToken::kw_post_instr_symbol)
250+
.Case("unknown-size", MIToken::kw_unknown_size)
250251
.Default(MIToken::Identifier);
251252
}
252253

‎llvm/lib/CodeGen/MIRParser/MILexer.h

+1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ struct MIToken {
115115
kw_intpred,
116116
kw_pre_instr_symbol,
117117
kw_post_instr_symbol,
118+
kw_unknown_size,
118119

119120
// Named metadata keywords
120121
md_tbaa,

‎llvm/lib/CodeGen/MIRParser/MIParser.cpp

+13-6
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "llvm/ADT/StringRef.h"
2525
#include "llvm/ADT/StringSwitch.h"
2626
#include "llvm/ADT/Twine.h"
27+
#include "llvm/Analysis/MemoryLocation.h"
2728
#include "llvm/AsmParser/Parser.h"
2829
#include "llvm/AsmParser/SlotMapping.h"
2930
#include "llvm/CodeGen/MIRPrinter.h"
@@ -2452,7 +2453,7 @@ bool MIParser::parseOptionalAtomicOrdering(AtomicOrdering &Order) {
24522453
return false;
24532454
}
24542455

2455-
return error("expected an atomic scope, ordering or a size integer literal");
2456+
return error("expected an atomic scope, ordering or a size specification");
24562457
}
24572458

24582459
bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {
@@ -2491,11 +2492,17 @@ bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {
24912492
if (parseOptionalAtomicOrdering(FailureOrder))
24922493
return true;
24932494

2494-
if (Token.isNot(MIToken::IntegerLiteral))
2495-
return error("expected the size integer literal after memory operation");
2495+
if (Token.isNot(MIToken::IntegerLiteral) &&
2496+
Token.isNot(MIToken::kw_unknown_size))
2497+
return error("expected the size integer literal or 'unknown-size' after "
2498+
"memory operation");
24962499
uint64_t Size;
2497-
if (getUint64(Size))
2498-
return true;
2500+
if (Token.is(MIToken::IntegerLiteral)) {
2501+
if (getUint64(Size))
2502+
return true;
2503+
} else if (Token.is(MIToken::kw_unknown_size)) {
2504+
Size = MemoryLocation::UnknownSize;
2505+
}
24992506
lex();
25002507

25012508
MachinePointerInfo Ptr = MachinePointerInfo();
@@ -2512,7 +2519,7 @@ bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {
25122519
if (parseMachinePointerInfo(Ptr))
25132520
return true;
25142521
}
2515-
unsigned BaseAlignment = Size;
2522+
unsigned BaseAlignment = (Size != MemoryLocation::UnknownSize ? Size : 1);
25162523
AAMDNodes AAInfo;
25172524
MDNode *Range = nullptr;
25182525
while (consumeIfPresent(MIToken::comma)) {

‎llvm/lib/CodeGen/MachineInstr.cpp

+14-7
Original file line numberDiff line numberDiff line change
@@ -1179,10 +1179,13 @@ bool MachineInstr::mayAlias(AliasAnalysis *AA, MachineInstr &Other,
11791179

11801180
int64_t OffsetA = MMOa->getOffset();
11811181
int64_t OffsetB = MMOb->getOffset();
1182-
11831182
int64_t MinOffset = std::min(OffsetA, OffsetB);
1184-
int64_t WidthA = MMOa->getSize();
1185-
int64_t WidthB = MMOb->getSize();
1183+
1184+
uint64_t WidthA = MMOa->getSize();
1185+
uint64_t WidthB = MMOb->getSize();
1186+
bool KnownWidthA = WidthA != MemoryLocation::UnknownSize;
1187+
bool KnownWidthB = WidthB != MemoryLocation::UnknownSize;
1188+
11861189
const Value *ValA = MMOa->getValue();
11871190
const Value *ValB = MMOb->getValue();
11881191
bool SameVal = (ValA && ValB && (ValA == ValB));
@@ -1198,6 +1201,8 @@ bool MachineInstr::mayAlias(AliasAnalysis *AA, MachineInstr &Other,
11981201
}
11991202

12001203
if (SameVal) {
1204+
if (!KnownWidthA || !KnownWidthB)
1205+
return true;
12011206
int64_t MaxOffset = std::max(OffsetA, OffsetB);
12021207
int64_t LowWidth = (MinOffset == OffsetA) ? WidthA : WidthB;
12031208
return (MinOffset + LowWidth > MaxOffset);
@@ -1212,13 +1217,15 @@ bool MachineInstr::mayAlias(AliasAnalysis *AA, MachineInstr &Other,
12121217
assert((OffsetA >= 0) && "Negative MachineMemOperand offset");
12131218
assert((OffsetB >= 0) && "Negative MachineMemOperand offset");
12141219

1215-
int64_t Overlapa = WidthA + OffsetA - MinOffset;
1216-
int64_t Overlapb = WidthB + OffsetB - MinOffset;
1220+
int64_t OverlapA = KnownWidthA ? WidthA + OffsetA - MinOffset
1221+
: MemoryLocation::UnknownSize;
1222+
int64_t OverlapB = KnownWidthB ? WidthB + OffsetB - MinOffset
1223+
: MemoryLocation::UnknownSize;
12171224

12181225
AliasResult AAResult = AA->alias(
1219-
MemoryLocation(ValA, Overlapa,
1226+
MemoryLocation(ValA, OverlapA,
12201227
UseTBAA ? MMOa->getAAInfo() : AAMDNodes()),
1221-
MemoryLocation(ValB, Overlapb,
1228+
MemoryLocation(ValB, OverlapB,
12221229
UseTBAA ? MMOb->getAAInfo() : AAMDNodes()));
12231230

12241231
return (AAResult != NoAlias);

‎llvm/lib/CodeGen/MachineOperand.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "llvm/CodeGen/MachineOperand.h"
1515
#include "llvm/ADT/StringExtras.h"
1616
#include "llvm/Analysis/Loads.h"
17+
#include "llvm/Analysis/MemoryLocation.h"
1718
#include "llvm/CodeGen/MIRPrinter.h"
1819
#include "llvm/CodeGen/MachineFrameInfo.h"
1920
#include "llvm/CodeGen/MachineJumpTableInfo.h"
@@ -1078,7 +1079,11 @@ void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,
10781079
if (getFailureOrdering() != AtomicOrdering::NotAtomic)
10791080
OS << toIRString(getFailureOrdering()) << ' ';
10801081

1081-
OS << getSize();
1082+
if (getSize() == MemoryLocation::UnknownSize)
1083+
OS << "unknown-size";
1084+
else
1085+
OS << getSize();
1086+
10821087
if (const Value *Val = getValue()) {
10831088
OS << ((isLoad() && isStore()) ? " on " : isLoad() ? " from " : " into ");
10841089
printIRValueReference(OS, *Val, MST);

‎llvm/lib/CodeGen/MachinePipeliner.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -3190,8 +3190,8 @@ void SwingSchedulerDAG::updateMemOperands(MachineInstr &NewMI,
31903190
NewMMOs.push_back(
31913191
MF.getMachineMemOperand(MMO, AdjOffset, MMO->getSize()));
31923192
} else {
3193-
NewMI.dropMemRefs(MF);
3194-
return;
3193+
NewMMOs.push_back(
3194+
MF.getMachineMemOperand(MMO, 0, MemoryLocation::UnknownSize));
31953195
}
31963196
}
31973197
NewMI.setMemRefs(MF, NewMMOs);

‎llvm/test/CodeGen/MIR/X86/expected-size-integer-after-memory-operation.mir

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ liveins:
1717
body: |
1818
bb.0.entry:
1919
liveins: $rdi
20-
; CHECK: [[@LINE+1]]:53: expected an atomic scope, ordering or a size integer literal
20+
; CHECK: [[@LINE+1]]:53: expected an atomic scope, ordering or a size specification
2121
$eax = MOV32rm killed $rdi, 1, _, 0, _ :: (load from %ir.a)
2222
RETQ $eax
2323
...
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# RUN: not llc -march=x86-64 -run-pass none -o /dev/null %s 2>&1 | FileCheck %s
2+
3+
--- |
4+
5+
define i32 @test(i32* %a) {
6+
entry:
7+
%b = load i32, i32* %a
8+
ret i32 %b
9+
}
10+
11+
...
12+
---
13+
name: test
14+
tracksRegLiveness: true
15+
liveins:
16+
- { reg: '$rdi' }
17+
body: |
18+
bb.0.entry:
19+
liveins: $rdi
20+
; CHECK: [[@LINE+1]]:53: expected the size integer literal or 'unknown-size' after memory operation
21+
$eax = MOV32rm killed $rdi, 1, _, 0, _ :: (load . from %ir.a)
22+
RETQ $eax
23+
...
24+

‎llvm/test/CodeGen/MIR/X86/memory-operands.mir

+28-1
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@
189189

190190
define void @dummy0() { ret void }
191191
define void @dummy1() { ret void }
192+
define void @dummy2() { ret void }
193+
define void @dummy3() { ret void }
192194
...
193195
---
194196
name: test
@@ -532,5 +534,30 @@ body: |
532534
bb.0:
533535
$rax = MOV64rm $rsp, 1, _, 0, _ :: (load 8 from %stack.0)
534536
RETQ $rax
535-
537+
...
538+
---
539+
# Test parsing of unknown size in machine memory operands without alignment.
540+
# CHECK-LABEL: name: dummy2
541+
# CHECK: $rax = MOV64rm $rsp, 1, $noreg, 0, $noreg :: (load unknown-size from %stack.0, align 1)
542+
name: dummy2
543+
tracksRegLiveness: true
544+
stack:
545+
- { id: 0, size: 4, alignment: 4 }
546+
body: |
547+
bb.0:
548+
$rax = MOV64rm $rsp, 1, _, 0, _ :: (load unknown-size from %stack.0)
549+
RETQ $rax
550+
...
551+
---
552+
# Test parsing of unknown size in machine memory operands with alignment.
553+
# CHECK-LABEL: name: dummy3
554+
# CHECK: $rax = MOV64rm $rsp, 1, $noreg, 0, $noreg :: (load unknown-size from %stack.0, align 4)
555+
name: dummy3
556+
tracksRegLiveness: true
557+
stack:
558+
- { id: 0, size: 4, alignment: 4 }
559+
body: |
560+
bb.0:
561+
$rax = MOV64rm $rsp, 1, _, 0, _ :: (load unknown-size from %stack.0, align 4)
562+
RETQ $rax
536563
...

0 commit comments

Comments
 (0)