@@ -350,18 +350,30 @@ fn inline_array_pop(fun: &mut hir::Function, block: hir::BlockId, recv: hir::Ins
350350}
351351
352352fn inline_hash_aref ( fun : & mut hir:: Function , block : hir:: BlockId , recv : hir:: InsnId , args : & [ hir:: InsnId ] , state : hir:: InsnId ) -> Option < hir:: InsnId > {
353- if let & [ key] = args {
353+ let & [ key] = args else { return None ; } ;
354+
355+ // Only optimize exact Hash, not subclasses
356+ if fun. likely_a ( recv, types:: HashExact , state) {
357+ let recv = fun. coerce_to ( block, recv, types:: HashExact , state) ;
354358 let result = fun. push_insn ( block, hir:: Insn :: HashAref { hash : recv, key, state } ) ;
355- return Some ( result) ;
359+ Some ( result)
360+ } else {
361+ None
356362 }
357- None
358363}
359364
360365fn inline_hash_aset ( fun : & mut hir:: Function , block : hir:: BlockId , recv : hir:: InsnId , args : & [ hir:: InsnId ] , state : hir:: InsnId ) -> Option < hir:: InsnId > {
361366 let & [ key, val] = args else { return None ; } ;
362- let _ = fun. push_insn ( block, hir:: Insn :: HashAset { hash : recv, key, val, state } ) ;
363- // Hash#[]= returns the value, not the hash
364- Some ( val)
367+
368+ // Only optimize exact Hash, not subclasses
369+ if fun. likely_a ( recv, types:: HashExact , state) {
370+ let recv = fun. coerce_to ( block, recv, types:: HashExact , state) ;
371+ let _ = fun. push_insn ( block, hir:: Insn :: HashAset { hash : recv, key, val, state } ) ;
372+ // Hash#[]= returns the value, not the hash
373+ Some ( val)
374+ } else {
375+ None
376+ }
365377}
366378
367379fn inline_string_bytesize ( fun : & mut hir:: Function , block : hir:: BlockId , recv : hir:: InsnId , args : & [ hir:: InsnId ] , state : hir:: InsnId ) -> Option < hir:: InsnId > {
0 commit comments