Yes, there is usually some documentation, for example Auto-vectorization in GCC - GNU Project.
I tried to vectorize your loop out of curiosity - Compiler Explorer . Haven’t tested it, but it should be the same as with intristics.
Note that I:

added const __restrict modifiers
added an indexing (induction) variable
removed if-else branches
All this to simplify job of code generator. They fail at auto-vectorizing very easily in all compilers, unfortunately.

I’ll paste just in case
void f(const float * __restrict in_i1, float * __restrict out_i1, int batch_stride, int numel)
{
    const int half_batch_stride = batch_stride / 2;
    const float *in_i2 = in_i1 + half_batch_stride;  // input index 2
    float *out_i2 = out_i1 + half_batch_stride;
    const float *batch_end = in_i2 + half_batch_stride;
    const float* end = in_i1 + numel;

    while(in_i2 < end){ 
        for(int i=0; i<batch_stride; i++) {
            float v1 = in_i1[i];
            float v2 = in_i2[i];
            float sum = v1+v2;
            bool b1 = v1 < 0, b2 = v2 < 0;

            out_i1[i] = b1 ? (b2 ? v2 : sum) : (b2 ? sum : v1);
            out_i2[i] = b1 ? (b2 ? v1 : sum) : (b2 ? sum : v2);
        }
        in_i1 += batch_stride;
        in_i2 += batch_stride;
        out_i1 += batch_stride;
        out_i2 += batch_stride; 

        in_i1 += half_batch_stride;
        in_i2 += half_batch_stride;        
        out_i1 += half_batch_stride;
        out_i2 += half_batch_stride; 
   }
}