Skip to content

Commit 4ac6f99

Browse files
[LiveInterval] Fix live range overlap check
Reviewed By: MatzeB Differential Revision: https://reviews.llvm.org/D145707
1 parent 7b8692a commit 4ac6f99

File tree

7 files changed

+122
-63
lines changed

7 files changed

+122
-63
lines changed

llvm/lib/CodeGen/LiveInterval.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ bool LiveRange::overlaps(const LiveRange &Other, const CoalescerPair &CP,
445445

446446
while (true) {
447447
// J has just been advanced to satisfy:
448-
assert(J->end >= I->start);
448+
assert(J->end > I->start);
449449
// Check for an overlap.
450450
if (J->start < I->end) {
451451
// I and J are overlapping. Find the later start.
@@ -460,11 +460,11 @@ bool LiveRange::overlaps(const LiveRange &Other, const CoalescerPair &CP,
460460
std::swap(I, J);
461461
std::swap(IE, JE);
462462
}
463-
// Advance J until J->end >= I->start.
463+
// Advance J until J->end > I->start.
464464
do
465465
if (++J == JE)
466466
return false;
467-
while (J->end < I->start);
467+
while (J->end <= I->start);
468468
}
469469
}
470470

llvm/test/CodeGen/ARM/neon-copy.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -612,11 +612,11 @@ define <8 x i8> @test_vcopy_lane_swap_s8(<8 x i8> %v1, <8 x i8> %v2) {
612612
define <16 x i8> @test_vcopyq_laneq_swap_s8(<16 x i8> %v1, <16 x i8> %v2) {
613613
; CHECK-LABEL: test_vcopyq_laneq_swap_s8:
614614
; CHECK: @ %bb.0:
615-
; CHECK-NEXT: vorr q9, q1, q1
616-
; CHECK-NEXT: vldr d20, .LCPI53_0
617-
; CHECK-NEXT: vorr q8, q0, q0
618-
; CHECK-NEXT: vtbl.8 d18, {d17, d18}, d20
619-
; CHECK-NEXT: vorr q0, q9, q9
615+
; CHECK-NEXT: @ kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
616+
; CHECK-NEXT: vldr d16, .LCPI53_0
617+
; CHECK-NEXT: @ kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
618+
; CHECK-NEXT: vtbl.8 d2, {d1, d2}, d16
619+
; CHECK-NEXT: vorr q0, q1, q1
620620
; CHECK-NEXT: bx lr
621621
; CHECK-NEXT: .p2align 3
622622
; CHECK-NEXT: @ %bb.1:

llvm/test/CodeGen/BPF/sockex2.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ flow_dissector.exit.thread: ; preds = %86, %12, %196, %199
311311
; CHECK-LABEL: bpf_prog2:
312312
; CHECK: r0 = *(u16 *)skb[12] # encoding: [0x28,0x00,0x00,0x00,0x0c,0x00,0x00,0x00]
313313
; CHECK: r0 = *(u16 *)skb[16] # encoding: [0x28,0x00,0x00,0x00,0x10,0x00,0x00,0x00]
314-
; CHECK: implicit-def: $r1
314+
; CHECK: implicit-def: $r8
315315
; CHECK: r1 =
316316
; CHECK: call 1 # encoding: [0x85,0x00,0x00,0x00,0x01,0x00,0x00,0x00]
317317
; CHECK: call 2 # encoding: [0x85,0x00,0x00,0x00,0x02,0x00,0x00,0x00]

llvm/test/CodeGen/X86/muloti.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ define %0 @x(i64 %a.coerce0, i64 %a.coerce1, i64 %b.coerce0, i64 %b.coerce1) nou
1515
; CHECK-NEXT: .cfi_offset %r14, -16
1616
; CHECK-NEXT: movq %rdx, %r11
1717
; CHECK-NEXT: movq %rdi, %r10
18-
; CHECK-NEXT: movq %rsi, %rdi
19-
; CHECK-NEXT: sarq $63, %rdi
18+
; CHECK-NEXT: movq %rsi, %rdx
19+
; CHECK-NEXT: sarq $63, %rdx
2020
; CHECK-NEXT: movq %rcx, %r8
21-
; CHECK-NEXT: imulq %rdi, %r8
22-
; CHECK-NEXT: movq %rdx, %rax
23-
; CHECK-NEXT: mulq %rdi
21+
; CHECK-NEXT: imulq %rdx, %r8
22+
; CHECK-NEXT: movq %r11, %rax
23+
; CHECK-NEXT: mulq %rdx
2424
; CHECK-NEXT: movq %rdx, %rdi
2525
; CHECK-NEXT: movq %rax, %rbx
2626
; CHECK-NEXT: addq %rax, %rdi

llvm/test/CodeGen/X86/smulo-128-legalisation-lowering.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ define zeroext i1 @smuloi128(i128 %v1, i128 %v2, ptr %res) {
1616
; X64-NEXT: .cfi_offset %r15, -16
1717
; X64-NEXT: movq %rdx, %rbx
1818
; X64-NEXT: movq %rdi, %r11
19-
; X64-NEXT: movq %rsi, %rdi
20-
; X64-NEXT: sarq $63, %rdi
19+
; X64-NEXT: movq %rsi, %rdx
20+
; X64-NEXT: sarq $63, %rdx
2121
; X64-NEXT: movq %rcx, %r9
22-
; X64-NEXT: imulq %rdi, %r9
23-
; X64-NEXT: movq %rdx, %rax
24-
; X64-NEXT: mulq %rdi
22+
; X64-NEXT: imulq %rdx, %r9
23+
; X64-NEXT: movq %rbx, %rax
24+
; X64-NEXT: mulq %rdx
2525
; X64-NEXT: movq %rdx, %rdi
2626
; X64-NEXT: movq %rax, %r14
2727
; X64-NEXT: addq %rax, %rdi

llvm/test/CodeGen/X86/vec_smulo.ll

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3310,12 +3310,12 @@ define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind
33103310
; SSE2-NEXT: movq %rdi, %r10
33113311
; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rsi
33123312
; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rbp
3313-
; SSE2-NEXT: movq %r11, %rdi
3314-
; SSE2-NEXT: sarq $63, %rdi
3313+
; SSE2-NEXT: movq %r11, %rdx
3314+
; SSE2-NEXT: sarq $63, %rdx
33153315
; SSE2-NEXT: movq %r9, %rbx
3316-
; SSE2-NEXT: imulq %rdi, %rbx
3316+
; SSE2-NEXT: imulq %rdx, %rbx
33173317
; SSE2-NEXT: movq %r15, %rax
3318-
; SSE2-NEXT: mulq %rdi
3318+
; SSE2-NEXT: mulq %rdx
33193319
; SSE2-NEXT: movq %rdx, %rdi
33203320
; SSE2-NEXT: movq %rax, %r12
33213321
; SSE2-NEXT: addq %rax, %rdi
@@ -3363,12 +3363,12 @@ define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind
33633363
; SSE2-NEXT: xorl %r15d, %r15d
33643364
; SSE2-NEXT: orq %rdx, %r10
33653365
; SSE2-NEXT: setne %r15b
3366-
; SSE2-NEXT: movq %rcx, %r9
3367-
; SSE2-NEXT: sarq $63, %r9
3366+
; SSE2-NEXT: movq %rcx, %rdx
3367+
; SSE2-NEXT: sarq $63, %rdx
33683368
; SSE2-NEXT: movq %rbp, %r11
3369-
; SSE2-NEXT: imulq %r9, %r11
3369+
; SSE2-NEXT: imulq %rdx, %r11
33703370
; SSE2-NEXT: movq %rsi, %rax
3371-
; SSE2-NEXT: mulq %r9
3371+
; SSE2-NEXT: mulq %rdx
33723372
; SSE2-NEXT: movq %rdx, %r9
33733373
; SSE2-NEXT: movq %rax, %r10
33743374
; SSE2-NEXT: addq %rax, %r9
@@ -3444,12 +3444,12 @@ define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind
34443444
; SSSE3-NEXT: movq %rdi, %r10
34453445
; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rsi
34463446
; SSSE3-NEXT: movq {{[0-9]+}}(%rsp), %rbp
3447-
; SSSE3-NEXT: movq %r11, %rdi
3448-
; SSSE3-NEXT: sarq $63, %rdi
3447+
; SSSE3-NEXT: movq %r11, %rdx
3448+
; SSSE3-NEXT: sarq $63, %rdx
34493449
; SSSE3-NEXT: movq %r9, %rbx
3450-
; SSSE3-NEXT: imulq %rdi, %rbx
3450+
; SSSE3-NEXT: imulq %rdx, %rbx
34513451
; SSSE3-NEXT: movq %r15, %rax
3452-
; SSSE3-NEXT: mulq %rdi
3452+
; SSSE3-NEXT: mulq %rdx
34533453
; SSSE3-NEXT: movq %rdx, %rdi
34543454
; SSSE3-NEXT: movq %rax, %r12
34553455
; SSSE3-NEXT: addq %rax, %rdi
@@ -3497,12 +3497,12 @@ define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind
34973497
; SSSE3-NEXT: xorl %r15d, %r15d
34983498
; SSSE3-NEXT: orq %rdx, %r10
34993499
; SSSE3-NEXT: setne %r15b
3500-
; SSSE3-NEXT: movq %rcx, %r9
3501-
; SSSE3-NEXT: sarq $63, %r9
3500+
; SSSE3-NEXT: movq %rcx, %rdx
3501+
; SSSE3-NEXT: sarq $63, %rdx
35023502
; SSSE3-NEXT: movq %rbp, %r11
3503-
; SSSE3-NEXT: imulq %r9, %r11
3503+
; SSSE3-NEXT: imulq %rdx, %r11
35043504
; SSSE3-NEXT: movq %rsi, %rax
3505-
; SSSE3-NEXT: mulq %r9
3505+
; SSSE3-NEXT: mulq %rdx
35063506
; SSSE3-NEXT: movq %rdx, %r9
35073507
; SSSE3-NEXT: movq %rax, %r10
35083508
; SSSE3-NEXT: addq %rax, %r9
@@ -3578,12 +3578,12 @@ define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind
35783578
; SSE41-NEXT: movq %rdi, %r10
35793579
; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rsi
35803580
; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rbp
3581-
; SSE41-NEXT: movq %r11, %rdi
3582-
; SSE41-NEXT: sarq $63, %rdi
3581+
; SSE41-NEXT: movq %r11, %rdx
3582+
; SSE41-NEXT: sarq $63, %rdx
35833583
; SSE41-NEXT: movq %r9, %rbx
3584-
; SSE41-NEXT: imulq %rdi, %rbx
3584+
; SSE41-NEXT: imulq %rdx, %rbx
35853585
; SSE41-NEXT: movq %r15, %rax
3586-
; SSE41-NEXT: mulq %rdi
3586+
; SSE41-NEXT: mulq %rdx
35873587
; SSE41-NEXT: movq %rdx, %rdi
35883588
; SSE41-NEXT: movq %rax, %r12
35893589
; SSE41-NEXT: addq %rax, %rdi
@@ -3631,12 +3631,12 @@ define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind
36313631
; SSE41-NEXT: xorl %r15d, %r15d
36323632
; SSE41-NEXT: orq %rdx, %r10
36333633
; SSE41-NEXT: setne %r15b
3634-
; SSE41-NEXT: movq %rcx, %r9
3635-
; SSE41-NEXT: sarq $63, %r9
3634+
; SSE41-NEXT: movq %rcx, %rdx
3635+
; SSE41-NEXT: sarq $63, %rdx
36363636
; SSE41-NEXT: movq %rbp, %r11
3637-
; SSE41-NEXT: imulq %r9, %r11
3637+
; SSE41-NEXT: imulq %rdx, %r11
36383638
; SSE41-NEXT: movq %rsi, %rax
3639-
; SSE41-NEXT: mulq %r9
3639+
; SSE41-NEXT: mulq %rdx
36403640
; SSE41-NEXT: movq %rdx, %r9
36413641
; SSE41-NEXT: movq %rax, %r10
36423642
; SSE41-NEXT: addq %rax, %r9
@@ -3711,12 +3711,12 @@ define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind
37113711
; AVX-NEXT: movq %rdi, %r10
37123712
; AVX-NEXT: movq {{[0-9]+}}(%rsp), %rsi
37133713
; AVX-NEXT: movq {{[0-9]+}}(%rsp), %rbp
3714-
; AVX-NEXT: movq %r11, %rdi
3715-
; AVX-NEXT: sarq $63, %rdi
3714+
; AVX-NEXT: movq %r11, %rdx
3715+
; AVX-NEXT: sarq $63, %rdx
37163716
; AVX-NEXT: movq %r9, %rbx
3717-
; AVX-NEXT: imulq %rdi, %rbx
3717+
; AVX-NEXT: imulq %rdx, %rbx
37183718
; AVX-NEXT: movq %r15, %rax
3719-
; AVX-NEXT: mulq %rdi
3719+
; AVX-NEXT: mulq %rdx
37203720
; AVX-NEXT: movq %rdx, %rdi
37213721
; AVX-NEXT: movq %rax, %r12
37223722
; AVX-NEXT: addq %rax, %rdi
@@ -3764,12 +3764,12 @@ define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind
37643764
; AVX-NEXT: xorl %r15d, %r15d
37653765
; AVX-NEXT: orq %rdx, %r10
37663766
; AVX-NEXT: setne %r15b
3767-
; AVX-NEXT: movq %rcx, %r9
3768-
; AVX-NEXT: sarq $63, %r9
3767+
; AVX-NEXT: movq %rcx, %rdx
3768+
; AVX-NEXT: sarq $63, %rdx
37693769
; AVX-NEXT: movq %rbp, %r11
3770-
; AVX-NEXT: imulq %r9, %r11
3770+
; AVX-NEXT: imulq %rdx, %r11
37713771
; AVX-NEXT: movq %rsi, %rax
3772-
; AVX-NEXT: mulq %r9
3772+
; AVX-NEXT: mulq %rdx
37733773
; AVX-NEXT: movq %rdx, %r9
37743774
; AVX-NEXT: movq %rax, %r10
37753775
; AVX-NEXT: addq %rax, %r9
@@ -3896,16 +3896,16 @@ define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind
38963896
; AVX512F-NEXT: orq %rdx, %r10
38973897
; AVX512F-NEXT: setne %al
38983898
; AVX512F-NEXT: kmovw %eax, %k0
3899-
; AVX512F-NEXT: movq %r9, %rsi
3900-
; AVX512F-NEXT: sarq $63, %rsi
3901-
; AVX512F-NEXT: movq %rbp, %rbx
3902-
; AVX512F-NEXT: imulq %rsi, %rbx
3899+
; AVX512F-NEXT: movq %r9, %rdx
3900+
; AVX512F-NEXT: sarq $63, %rdx
3901+
; AVX512F-NEXT: movq %rbp, %rsi
3902+
; AVX512F-NEXT: imulq %rdx, %rsi
39033903
; AVX512F-NEXT: movq %r8, %rax
3904-
; AVX512F-NEXT: mulq %rsi
3904+
; AVX512F-NEXT: mulq %rdx
39053905
; AVX512F-NEXT: movq %rdx, %r10
39063906
; AVX512F-NEXT: movq %rax, %r11
39073907
; AVX512F-NEXT: addq %rax, %r10
3908-
; AVX512F-NEXT: addq %rbx, %r10
3908+
; AVX512F-NEXT: addq %rsi, %r10
39093909
; AVX512F-NEXT: movq %rbp, %rax
39103910
; AVX512F-NEXT: sarq $63, %rax
39113911
; AVX512F-NEXT: movq %rax, %rsi
@@ -4029,16 +4029,16 @@ define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, ptr %p2) nounwind
40294029
; AVX512BW-NEXT: orq %rdx, %r10
40304030
; AVX512BW-NEXT: setne %al
40314031
; AVX512BW-NEXT: kmovd %eax, %k0
4032-
; AVX512BW-NEXT: movq %r9, %rsi
4033-
; AVX512BW-NEXT: sarq $63, %rsi
4034-
; AVX512BW-NEXT: movq %rbp, %rbx
4035-
; AVX512BW-NEXT: imulq %rsi, %rbx
4032+
; AVX512BW-NEXT: movq %r9, %rdx
4033+
; AVX512BW-NEXT: sarq $63, %rdx
4034+
; AVX512BW-NEXT: movq %rbp, %rsi
4035+
; AVX512BW-NEXT: imulq %rdx, %rsi
40364036
; AVX512BW-NEXT: movq %r8, %rax
4037-
; AVX512BW-NEXT: mulq %rsi
4037+
; AVX512BW-NEXT: mulq %rdx
40384038
; AVX512BW-NEXT: movq %rdx, %r10
40394039
; AVX512BW-NEXT: movq %rax, %r11
40404040
; AVX512BW-NEXT: addq %rax, %r10
4041-
; AVX512BW-NEXT: addq %rbx, %r10
4041+
; AVX512BW-NEXT: addq %rsi, %r10
40424042
; AVX512BW-NEXT: movq %rbp, %rax
40434043
; AVX512BW-NEXT: sarq $63, %rax
40444044
; AVX512BW-NEXT: movq %rax, %rsi

llvm/unittests/MI/LiveIntervalTest.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "llvm/CodeGen/MachineFunction.h"
55
#include "llvm/CodeGen/MachineModuleInfo.h"
66
#include "llvm/CodeGen/TargetRegisterInfo.h"
7+
#include "llvm/CodeGen/TargetSubtargetInfo.h"
78
#include "llvm/IR/LegacyPassManager.h"
89
#include "llvm/InitializePasses.h"
910
#include "llvm/MC/TargetRegistry.h"
@@ -14,6 +15,8 @@
1415
#include "llvm/Target/TargetOptions.h"
1516
#include "gtest/gtest.h"
1617

18+
#include "../lib/CodeGen/RegisterCoalescer.h"
19+
1720
using namespace llvm;
1821

1922
namespace llvm {
@@ -162,6 +165,26 @@ static void testSplitAt(MachineFunction &MF, LiveIntervals &LIS,
162165
MBB.splitAt(SplitInstr, false, &LIS);
163166
}
164167

168+
/**
169+
* Helper function to test for interference between a hard register and a
170+
* virtual register live ranges.
171+
*/
172+
static bool checkRegUnitInterference(LiveIntervals &LIS,
173+
const TargetRegisterInfo &TRI,
174+
const LiveInterval &VirtReg,
175+
MCRegister PhysReg) {
176+
if (VirtReg.empty())
177+
return false;
178+
CoalescerPair CP(VirtReg.reg(), PhysReg, TRI);
179+
180+
for (MCRegUnitIterator Units(PhysReg, &TRI); Units.isValid(); ++Units) {
181+
const LiveRange &UnitRange = LIS.getRegUnit(*Units);
182+
if (VirtReg.overlaps(UnitRange, CP, *LIS.getSlotIndexes()))
183+
return true;
184+
}
185+
return false;
186+
}
187+
165188
static void liveIntervalTest(StringRef MIRFunc, LiveIntervalTest T) {
166189
LLVMContext Context;
167190
std::unique_ptr<LLVMTargetMachine> TM = createTargetMachine();
@@ -683,6 +706,42 @@ TEST(LiveIntervalTest, RepairIntervals) {
683706
});
684707
}
685708

709+
TEST(LiveIntervalTest, AdjacentIntervals) {
710+
liveIntervalTest(
711+
R"MIR(
712+
successors: %bb.1, %bb.2
713+
714+
$vgpr1 = IMPLICIT_DEF
715+
S_NOP 0, implicit $vgpr1
716+
%1:vgpr_32 = IMPLICIT_DEF
717+
%2:vgpr_32 = IMPLICIT_DEF
718+
S_CBRANCH_VCCNZ %bb.2, implicit undef $vcc
719+
S_BRANCH %bb.1
720+
bb.1:
721+
$vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 %1, %2, 0, implicit $exec
722+
S_NOP 0, implicit $vgpr0
723+
S_BRANCH %bb.3
724+
bb.2:
725+
$vgpr0 = IMPLICIT_DEF
726+
$vgpr1, dead renamable $vcc = V_ADD_CO_U32_e64 %1, %2, 0, implicit $exec
727+
S_NOP 0, implicit $vgpr0, implicit $vgpr1
728+
S_BRANCH %bb.3
729+
bb.3:
730+
)MIR",
731+
[](MachineFunction &MF, LiveIntervals &LIS) {
732+
const auto &R1 =
733+
LIS.getInterval(getMI(MF, 2, 0).getOperand(0).getReg());
734+
const auto &R2 =
735+
LIS.getInterval(getMI(MF, 3, 0).getOperand(0).getReg());
736+
MCRegister V1 = getMI(MF, 1, 2).getOperand(0).getReg().asMCReg();
737+
738+
ASSERT_FALSE(checkRegUnitInterference(
739+
LIS, *MF.getSubtarget().getRegisterInfo(), R1, V1));
740+
ASSERT_FALSE(checkRegUnitInterference(
741+
LIS, *MF.getSubtarget().getRegisterInfo(), R2, V1));
742+
});
743+
}
744+
686745
int main(int argc, char **argv) {
687746
::testing::InitGoogleTest(&argc, argv);
688747
initLLVM();

0 commit comments

Comments
 (0)