<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/54093>54093</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine] Infinite loop is happening with `-no-enable-noundef-analysis` option
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Saldivarcher
      </td>
    </tr>
</table>

<pre>
    After commit 8a156d1 this sample code (smallest I could get it), causes an infinte loop. The `noundef-analysis` flag has since been disabled, so by default the infinite loop doesn't happen. 

I tracked down the issue to be that before the commit, this [branch](https://github.com/llvm/llvm-project/blob/main/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp#L2741) was getting hit because the previous check would always hit this [return](https://github.com/llvm/llvm-project/commit/8a156d1#diff-002ae337f07421dd530c34dceada72ac11c56191e5f653b42ee27cdaef892734L2686).

```c
#define SKM_sk_value(type, st,i) \
        ((type *)sk_value(CHECKED_STACK_OF(type, st), i))
#define sk_ASN1_VALUE_value(st, i) SKM_sk_value(ASN1_VALUE, (st), (i))

#define ASN1_TFLG_NDEF          (0x1<<11)
#define ASN1_TFLG_SK_MASK       (0x3 << 1)
#define ASN1_TFLG_EXPTAG        (0x2 << 3)

#define ASN1_ITEM_ptr(iptr) (iptr)

int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
                     const ASN1_ITEM *it, int tag, int aclass)
{
    const ASN1_TEMPLATE *tt = NULL;
    int i;

    for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
        const ASN1_TEMPLATE *seqtt;        ASN1_VALUE **pseqval;
        int tmplen;
        seqtt = asn1_do_adb(pval, tt, 1);
        tmplen = asn1_template_ex_i2d(pseqval, NULL, seqtt, -1, aclass);
    }

    for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
        const ASN1_TEMPLATE *seqtt;
        ASN1_VALUE **pseqval;
        seqtt = asn1_do_adb(pval, tt, 1);
        asn1_template_ex_i2d(pseqval, out, seqtt, -1, aclass);
    }
    return 0;
}

static int asn1_template_ex_i2d(ASN1_VALUE **pval, unsigned char **out,
                                const ASN1_TEMPLATE *tt, int tag, int iclass)
{
    int i, ret, flags, ttag, tclass, ndef;
    ASN1_VALUE *tval;
    flags = tt->flags;

    if ((flags & ASN1_TFLG_NDEF) && (iclass & ASN1_TFLG_NDEF))
        ndef = 2;
    else
        ndef = 1;

    if (flags & ASN1_TFLG_SK_MASK) {
        STACK_OF(ASN1_VALUE) *sk = (STACK_OF(ASN1_VALUE) *)*pval;
        int sktag;
        int skcontlen, sklen;
        ASN1_VALUE *skitem;

        for (i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
            skitem = sk_ASN1_VALUE_value(sk, i);
        }
        sklen = ASN1_object_size(ndef, skcontlen, sktag);

        if (flags & ASN1_TFLG_EXPTAG)
            ret = ASN1_object_size(ndef, sklen, ttag);

        if (!out || ret == -1)
            return ret;

        if (ndef == 2) {
            ASN1_put_eoc(out);
        }

        return ret;
    }

    return 0;
}
```

```bash
$ clang -c reproduce.c -march=znver2 -O3 -Xclang -no-enable-noundef-analysis
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNV0uT2jgQ_jXmojLlBxh84MDwyE4Nk6QKspWbS5Zl0GJkryXPZPLr05JssBlDkt09LOXCD3V_6v7U3VLHefI2m6eSlojkpxOTaIrdcZC4SB6YQAKfiozCUEKR5U3FCWcZFRI9wqcqS9CeSsSk5YWWt0AEV4IKhDliPGVcUpTleTFEuwMoBw7PK57Q1MYcZ2-CCfiE0gzv0QHDRIwTimJKOUqYwHFGEwUpchS_IdDCVSbBJGqgWY2NkpwKbnkTCSBFQfkQWc7Scubm_xHJEpMjTUDulRt1ISqKJMDC_wFLuKd5SfWYIUBNq323xg9xiTk5WOMl-H6QshCWP7e8NVx7Jg9VPAQVeMmyl-ZmF2X-FyWAso6zPIbbCTPekmHq2w5wBcx7EvDyyIVc5KeYcdp929IMkIakKCzP33iTkQtEo1dgC2iXjANzTDmgedceFCV9YXklEDlQckSveo1w9orfhJZt_CqprEr-D_1qaFrXkQLGJSxNbcfxMPX9SepMRp6bJGPfIf4oIRQneOJh4rpkHLihS8dpMPbjkUepNyEJpuk09Cb-aOMF0wA8HLaXEILEXKR-h8koRABF26fnSByjF5xVwNtUvhVUR4xaQKaIssYLo4PqH0jVgvAISGFLffHHavG0Wkbb3XzxFH1aXyHq-Gb6Hl4bAijz7Uc3-nO--bI6A2o7tMq1pRdhJVGLhvVzd46rmbTmbr35EH1crtYItRxzvrmWv4DLdXtMvChun6Ln-fapregjo4nua66-ft7NP3Sm9BpN_77Jj7vVc1TIUvmnbyG6PLb1oGgYDUjwU0S_RcxLOoyZhZsXwKUirOKC7TnkNzngsh7LK8V8d-U7P5JDil0MU2om69XsEu-bR0wyLMTFwsnDBbSFARCfN_OdNk1KYGSJPn7ZbCy_Ja7g2PnL5TuUAM2E1nJ05TEITNqWvwISigxLCun5gJTQohmA6sul-irB8gd96WAzj0Bv29g7Bgv6t9Q49e890yChyPav8DRXam_g74Y0pvYCC-5GSR7hBIretFk0qcnWwXatahAvug0Bl1Bo7AEEzbLKT-0DPNiu-r8sWxvdmiz_t-R3hX95Cf4Fzz8n12TRb3KrXszWAnyeo73LvJBYMmISrN-K_zbb-xO_m7Q9yc_uJL_JZhAEX9VNHWKEYdwAyFp5gdSBp8NV1zl5va4aSq-p1LFmoN8XDpbWu1mt4AVXm4OpsYEaUDGuDeoXO_vY0KRs1iZ4HdNoJugNQfemhX3m1VtQb6a0tt_2NhnqdDnqyWDonpT2yIRMX80SR7VG_SMQH1IVNBX3x77K1l08cVS7VI_rPcXlXEK6hwVendT-fzQZdbeG6IzXM2rIG4eO4_mccm17J0kNWFNqNVAeq-NdJNh3BaTjVvPQIUXHd3jD5dsrbo4O7wKtLhc_t6GeX_7C9JbnQkkAbxdwNehqAtu9Nb8qVyqT78E2oW7S4tb6aCeKSkY0J6Cka9Odleh-7rHkhvSdEtuclnuP0DEWh-Z8NkJQEqCDsAnAwdk-qQgdEmSfcAkNj7_8zl9o6SH7k4_sr7Uoz23KVWtmv2vluhMNkpmfhH6IB5JB8Myg42g3OeMleux0cdCUmPZN9TSv0IGodvHedNA55oVkOR9UZTb77Q5GN4Gq9RqPnNAfHGbTJEzjICXjER6l1AuwP4kpNDJxEKZh4ONBhmOof8oRsH7AZp7jqStwHAcwhklKJg5OXTzGDg4d1xo5FPq-bKgmHublflDOtA1xBeV85GRMSHEZhNqsNjba4ONKHvJytsVZwl7UgtByoG2eaYN_ANbzYkY">