RelOptInfo *brel = root->simple_rel_array[rti];
        RangeTblEntry *brte = root->simple_rte_array[rti];
 
-       if (brel == NULL)
+       /*
+        * Skip empty slots. Also skip non-simple relations i.e. dead
+        * relations.
+        */
+       if (brel == NULL || !IS_SIMPLE_REL(brel))
            continue;
 
        /*
         * therefore be marked with the appropriate lateral info so that those
         * children eventually get marked also.
         */
-       Assert(IS_SIMPLE_REL(brel));
        Assert(brte);
        if (brel->reloptkind == RELOPT_OTHER_MEMBER_REL &&
            (brte->rtekind != RTE_RELATION ||
 
  Seq Scan on int8_tbl i8
 (1 row)
 
+-- check join removal with lateral references
+explain (costs off)
+select 1 from (select a.id FROM a left join b on a.b_id = b.id) q,
+             lateral generate_series(1, q.id) gs(i) where q.id = gs.i;
+                QUERY PLAN                 
+-------------------------------------------
+ Nested Loop
+   ->  Seq Scan on a
+   ->  Function Scan on generate_series gs
+         Filter: (a.id = i)
+(4 rows)
+
 rollback;
 create temp table parent (k int primary key, pd int);
 create temp table child (k int unique, cd int);
 
 select i8.* from int8_tbl i8 left join (select f1 from int4_tbl group by f1) i4
   on i8.q1 = i4.f1;
 
+-- check join removal with lateral references
+explain (costs off)
+select 1 from (select a.id FROM a left join b on a.b_id = b.id) q,
+             lateral generate_series(1, q.id) gs(i) where q.id = gs.i;
+
 rollback;
 
 create temp table parent (k int primary key, pd int);