Closed
Bug 680621
Opened 13 years ago
Closed 13 years ago
IonMonkey: Snapshot captures phi of successor block
Categories
(Core :: JavaScript Engine, defect)
Tracking
()
RESOLVED
FIXED
People
(Reporter: adrake, Assigned: dvander)
References
Details
Attachments
(2 files, 1 obsolete file)
115 bytes,
application/javascript
|
Details | |
20.68 KB,
patch
|
sstangl
:
review+
|
Details | Diff | Splinter Review |
Attached test case produces a graph with a snapshot capturing a phi from a successor block on ionmonkey tip x86 debug builds.
![]() |
Assignee | |
Comment 1•13 years ago
|
||
I can't seem to find where this his happening - and it works on the greedy allocator. For example, here's some spew with the attached patch and IONFLAGS=snapshots:
Note, I did find one bug but it didn't seem to change anything. Note that the only snapshot captured in LIR does not seem to have phis.
Current snapshot 0x8567108 details:
taken at block 0 entry
pc: 0x8568c8c
slot0: parameter2-vn2
slot1: parameter4-vn4
slot2: constant6-vn6
slot3: constant6-vn6
Current snapshot 0x8567108 details:
taken after:parameter1-vn2
pc: 0x8568c8c
slot0: parameter1-vn2
slot1: parameter4-vn4
slot2: constant6-vn6
slot3: constant6-vn6
Current snapshot 0x8567108 details:
taken after:parameter3-vn4
pc: 0x8568c8c
slot0: parameter1-vn2
slot1: parameter3-vn4
slot2: constant6-vn6
slot3: constant6-vn6
Current snapshot 0x8567a08 details:
taken at block 1 entry
pc: 0x8568c8c
slot0: parameter1-vn2
slot1: parameter3-vn4
slot2: compare16-vn16
slot3: constant0-vn6
Current snapshot 0x8567508 details:
taken at block 2 entry
pc: 0x8568ca5
slot0: parameter1-vn2
slot1: parameter3-vn4
slot2: compare16-vn16
slot3: constant0-vn6
[Snapshots] Generating LIR snapshot 0x8568f60 from MIR (0x8567508)
[Snapshots] Assigning snapshot 0x8568f60 to instruction 0x8568f30
Current snapshot 0x8567660 details:
taken at block 3 entry
pc: 0x8568cae
slot0: parameter1-vn2
slot1: parameter3-vn4
slot2: compare16-vn16
slot3: phi28-vn28
[Snapshots] Encoding snapshot 0x8568f60 (nfixed 4) (exprStack 0)
[Snapshots] slot 0: value (t=144, d=140)
[Snapshots] slot 1: value (t=152, d=esi)
[Snapshots] slot 2: boolean (ecx)
[Snapshots] slot 3: undefined
[Snapshots] total size: 18 bytes
undefined
![]() |
Assignee | |
Comment 2•13 years ago
|
||
Reporter | ||
Comment 3•13 years ago
|
||
Here's a trace in gdb showing the bad snapshot:
Assertion failure: live->empty(), at /home/adrake/moz/ionmonkey/js/src/ion/LinearScan.cpp:573
Program received signal SIGABRT, Aborted.
0x00110430 in __kernel_vsyscall ()
(gdb) up 4
#4 0x08394f92 in js::ion::LinearScanAllocator::buildLivenessInfo (this=0xffffbb54) at /home/adrake/moz/ionmonkey/js/src/ion/LinearScan.cpp:573
573 JS_ASSERT_IF(!mblock->numPredecessors(), live->empty());
(gdb) p live->contains(16)
$1 = true
(gdb) p vregs[16].uses_[1].ins->id()
$2 = 11
(gdb) p vregs[16].uses_[1].ins->snapshot()->getEntry(5)->toUse()->virtualRegister()
$3 = 16
From that dump and this gdb session, it looks like the entry snapshots on the two branches have captured register 16, which does not dominate either branch.
![]() |
Assignee | |
Comment 4•13 years ago
|
||
Two bugs.
(1) When checking if we can optimize a test(compare) to test-compare, we ignore snapshot uses, so snapshots captured a bogus virtual register. I've rejiggered the API for mapping MIR to virtual registers to assert when this happens in the future. It's super hard to debug otherwise.
(2) For some bizarre reason, during lowering assignSnapshot() looked at the completely wrong snapshot.
Assignee: general → dvander
Attachment #555281 -
Attachment is obsolete: true
Status: NEW → ASSIGNED
Attachment #555306 -
Flags: review?(sstangl)
![]() |
Assignee | |
Comment 5•13 years ago
|
||
Additionally there was another (potential) bug. We cannot make the test-compare optimization if the compare is not idempotent.
Comment 6•13 years ago
|
||
Comment on attachment 555306 [details] [diff] [review]
fix
Review of attachment 555306 [details] [diff] [review]:
-----------------------------------------------------------------
If you think that the keyword "virtualRegister" used everywhere is unnecessarily verbose, we could instead unambiguously call it a "vreg".
::: js/src/ion/MIR.h
@@ +88,5 @@
> _(LoopInvariant) \
> _(Commutative) \
> _(Idempotent) /* The instruction has no side-effects. */ \
> + _(NeverHoisted) /* Don't hoist, even if loop invariant */ \
> + _(Lowered) /* has a virtual register */
Comment should express that it is only intended for use in debug mode.
Attachment #555306 -
Flags: review?(sstangl) → review+
![]() |
Assignee | |
Comment 7•13 years ago
|
||
Status: ASSIGNED → RESOLVED
Closed: 13 years ago
Resolution: --- → FIXED
You need to log in
before you can comment on or make changes to this bug.
Description
•