def _determine_transform(self, cfg, block, label, scope, init_equiv_set):
        """Determine the transformation for each instruction in the block
        """
        equiv_set = None
        # equiv_set is the intersection of predecessors
        preds = cfg.predecessors(label)
        # some incoming edge may be pruned due to prior analysis
        if label in self.pruned_predecessors:
            pruned = self.pruned_predecessors[label]
        else:
            pruned = []
        # Go through each incoming edge, process prepended instructions and
        # calculate beginning equiv_set of current block as an intersection
        # of incoming ones.
        if config.DEBUG_ARRAY_OPT >= 2:
            print("preds:", preds)
        for (p, q) in preds:
            if config.DEBUG_ARRAY_OPT >= 2:
                print("p, q:", p, q)
            if p in pruned:
                continue
            if p in self.equiv_sets:
                from_set = self.equiv_sets[p].clone()
                if config.DEBUG_ARRAY_OPT >= 2:
                    print("p in equiv_sets", from_set)
                if (p, label) in self.prepends:
                    instrs = self.prepends[(p, label)]
                    for inst in instrs:
                        redefined = set()
                        self._analyze_inst(
                            label, scope, from_set, inst, redefined
                        )
                        # Remove anything multiply defined in this block
                        # from every block equivs.
                        # NOTE: necessary? can't observe effect in testsuite
                        self.remove_redefineds(redefined)
                if equiv_set is None:
                    equiv_set = from_set
                else:
                    equiv_set = equiv_set.intersect(from_set)
                    redefined = set()
                    equiv_set.union_defs(from_set.defs, redefined)
                    # Remove anything multiply defined in this block
                    # from every block equivs.
                    # NOTE: necessary? can't observe effect in testsuite
                    self.remove_redefineds(redefined)

        # Start with a new equiv_set if none is computed
        if equiv_set is None:
            equiv_set = init_equiv_set
        self.equiv_sets[label] = equiv_set

        # Go through instructions in a block, and insert pre/post
        # instructions as we analyze them.
        pending_transforms = []
        for inst in block.body:
            redefined = set()
            pre, post = self._analyze_inst(
                label, scope, equiv_set, inst, redefined
            )
            # Remove anything multiply defined in this block from every block
            # equivs.
            if len(redefined) > 0:
                self.remove_redefineds(redefined)

            pending_transforms.append((inst, pre, post))
        return pending_transforms
Determine the transformation for each instruction in the block
        
numba/parfors/array_analysis.py