I'm trying to fix an inefficiency of WITH-ARRAY-DATA. It does not know that if (NOT (ARRAY-HEADER-P)), then its object under test is simple or not an array.
Since it doesn't begin with a check that the object is an array at all, it might need to check that, but in many cases there was already an assertion that the object is a vector.  A reduced example would be:

  * (disassemble
     '(lambda (x)
        (declare (bit-vector x))
        (if (array-header-p x) 'hairy (simpfn (the simple-bit-vector x)))))

Before calling SIMPFN is a test of SIMPLE-BIT-VECTOR-P, though the type should be derived as both SIMPLE-ARRAY and BIT-VECTOR.
; 6A:       807EF1D5         CMP BYTE PTR [RSI-15], -43
; 6E:       751B             JNE L2
; 70:       488BD6           MOV RDX, RSI
; 73:       488B055EFFFFFF   MOV RAX, [RIP-162]               ; #<FDEFINITION object for SIMPFN>
; 8B: L2:   0F0B0A           BREAK 10                         ; error trap
; 8E:       04               BYTE #X04
; 8F:       62               BYTE #X62                        ; OBJECT-NOT-SIMPLE-BIT-VECTOR-ERROR
; 90:       FE1B03           BYTE #XFE, #X1B, #X03            ; RSI

Part of the issue is the inability to reason about ARRAY-HEADER-P.  I've fixed that adequately.

* (deftype array-header ()
   '(or (and simple-array (not vector)) (and array (not simple-array))))
* (specifier-type '(and bit-vector (not array-header)))

Without my changes the answer would have been:

Next I'm trying to emulate how TYPEP confers knowledge of the object's type, with something like this:
* (setf (gethash 'sb-kernel:array-header-p sb-c::*backend-predicate-types*)
        (specifier-type 'array-header))
* (disassemble '(lambda (s)
  (if (bit-vector-p s)
      (if (sb-c::%typep-wrapper (sb-kernel:array-header-p s)
          (simpfn (the simple-bit-vector s))))))

and I'm still getting the type-check as shown in the above disassembly.

But it should have propagated
  (type-intersection (specifier-type 'bit-vector) (specifier-type '(not array-header)))

What's going wrong?