Fix a bug by not recording normalized layouts

This commit is contained in:
Ayaz Hafiz 2023-01-23 14:24:06 -06:00
parent 7169d0974d
commit 695b2e6363
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58

View file

@ -608,7 +608,6 @@ impl<'a> LayoutInterner<'a> for TLLayoutInterner<'a> {
(normalized_layout, interned_layout)
});
self.record(normalized_layout, interned);
if let Some(full_layout) = new_interned_full_layout {
self.record(full_layout, interned);
}
@ -1005,7 +1004,7 @@ mod insert_recursive_layout {
use crate::layout::{Builtin, InLayout, Layout, UnionLayout};
use super::{GlobalLayoutInterner, LayoutInterner, TLLayoutInterner};
use super::{GlobalLayoutInterner, LayoutInterner};
const TARGET_INFO: TargetInfo = TargetInfo::default_x86_64();
@ -1018,7 +1017,7 @@ mod insert_recursive_layout {
])))
}
fn get_rec_ptr_index<'a>(interner: &TLLayoutInterner<'a>, layout: InLayout<'a>) -> usize {
fn get_rec_ptr_index<'a>(interner: &impl LayoutInterner<'a>, layout: InLayout<'a>) -> usize {
match interner.get(layout) {
Layout::Union(UnionLayout::Recursive(&[&[l1], &[l2]])) => {
match (interner.get(l1), interner.get(l2)) {
@ -1065,6 +1064,38 @@ mod insert_recursive_layout {
assert_eq!(in1, in2);
}
#[test]
fn write_twice_thread_local_single_thread() {
let arena = &Bump::new();
let global = GlobalLayoutInterner::with_capacity(2, TARGET_INFO);
let mut interner = global.fork();
let layout = make_layout(arena, &mut interner);
let in1 = interner.insert_recursive(arena, layout);
let rec1 = get_rec_ptr_index(&interner, in1);
let in2 = interner.insert_recursive(arena, layout);
let rec2 = get_rec_ptr_index(&interner, in2);
assert_eq!(in1, in2);
assert_eq!(rec1, rec2);
}
#[test]
fn write_twice_single_thread() {
let arena = &Bump::new();
let global = GlobalLayoutInterner::with_capacity(2, TARGET_INFO);
let mut interner = GlobalLayoutInterner::unwrap(global).unwrap();
let layout = make_layout(arena, &mut interner);
let in1 = interner.insert_recursive(arena, layout);
let rec1 = get_rec_ptr_index(&interner, in1);
let in2 = interner.insert_recursive(arena, layout);
let rec2 = get_rec_ptr_index(&interner, in2);
assert_eq!(in1, in2);
assert_eq!(rec1, rec2);
}
#[test]
fn many_threads_read_write() {
for _ in 0..100 {