https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66908
--- Comment #11 from Marek Polacek <mpolacek at gcc dot gnu.org> --- Hmm, still can't reproduce even with vanilla trunk: A = A.0; D.2679 = get.__pfn; D.2680 = (long int) D.2679; D.2681 = D.2680 & 1; if (D.2681 == 0) goto <D.2682>; else goto <D.2683>; <D.2682>: iftmp.1 = get.__pfn; goto <D.2684>; <D.2683>: D.2685 = get.__delta; D.2686 = (sizetype) D.2685; D.2687 = A + D.2686; D.2688 = MEM[(int (*__vtbl_ptr_type) () * *)D.2687]; D.2689 = get.__pfn; D.2690 = (long int) D.2689; D.2691 = D.2690 + -1; D.2692 = (sizetype) D.2691; D.2693 = D.2688 + D.2692; iftmp.1 = *D.2693; <D.2684>: D.2694 = get.__delta; D.2695 = (sizetype) D.2694; D.2696 = A + D.2695; result = iftmp.1 (D.2696); operator delete (A); D.2697 = result; return D.2697; I don't see the shifts at all.