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

    <tr>
        <th>Summary</th>
        <td>
             [PPC] Invalid PPC CTR loop! with powerpcspe
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    After upgrading the FreeBSD base system with llvm 14.0.3, I started seeing errors with the powerpcspe builds:

```
Invalid PPC CTR loop!
UNREACHABLE executed at /usr/src/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCCTRLoops.cpp:179!
PLEASE submit a bug report to https://bugs.freebsd.org/submit/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: clang -cc1 -triple powerpcspe-unknown-freebsd14.0 -emit-obj --mrelax-relocations -disable-free -clear-ast-before-backend -main-file-name gdtoa_dtoa.c -mrelocation-model static -mframe-pointer=none -relaxed-aliasing -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu e500 -target-feature +spe -target-feature +secure-plt -mfloat-abi hard -mllvm -treat-scalable-fixed-error-as-warning -debug-info-kind=standalone -dwarf-version=4 -debugger-tuning=gdb -fcoverage-compilation-dir=/home/dim/obj/home/dim/src/main/powerpc.powerpcspe/lib/libc -sys-header-deps -D NO__SCCSID -D NO__RCSID -D NLS -D __DBINTERFACE_PRIVATE -D INET6 -D _ACL_PRIVATE -D POSIX_MISTAKE -D BROKEN_DES -D PORTMAP -D DES_BUILTIN -D YP -D NS_CACHING -D SYMBOL_VERSIONING -O2 -Wno-format-zero-length -Wno-empty-body -Wno-string-plus-int -Wno-unused-const-variable -Wno-error=unused-but-set-variable -Wno-tautological-compare -Wno-unused-value -Wno-parentheses-equality -Wno-unused-function -Wno-enum-conversion -Wno-unused-local-typedef -Wno-address-of-packed-member -Wno-switch -Wno-switch-enum -Wno-knr-promoted-parameter -w -std=gnu99 -fdebug-compilation-dir=/home/dim/obj/home/dim/src/main/powerpc.powerpcspe/lib/libc -ferror-limit 19 -ftls-model=initial-exec -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -x c gdtoa_dtoa-88928c.c
1.      <eof> parser at end of file
2.      Code generation
3.      Running pass 'Function Pass Manager' on module 'gdtoa_dtoa-88928c.c'.
4.      Running pass 'PowerPC CTR Loops Verify' on function '@__dtoa'
```

This turns out to still be a problem with very recent main (26c82f3d1de is the last I tried).

Reduced test case (C version):

```C
// clang -cc1 -triple powerpcspe-- -S -ffp-contract=on -target-feature +spe -O2 gdtoa_dtoa-min.c
typedef struct {
  int d;
} U;
int __dtoa_i;
U __dtoa_d;
double __dtoa_ds;
void __dtoa() {
  for (;; __dtoa_i++) {
    (&__dtoa_d)->d -= 0 * __dtoa_ds;
    if (__dtoa_i == 1)
      break;
  }
}
```

.ll version:

```ll
; ModuleID = 'gdtoa_dtoa-min.c'
source_filename = "gdtoa_dtoa-min.c"
target datalayout = "E-m:e-p:32:32-i64:64-n32"
target triple = "powerpcspe-unknown-unknown"

%struct.U = type { i32 }

@__dtoa_d = external local_unnamed_addr global %struct.U, align 4

define dso_local void @__dtoa() local_unnamed_addr #0 {
entry:
  br label %for.inc

for.inc:                                          ; preds = %for.inc, %entry
  %conv17 = phi i32 [ %conv1, %for.inc ], [ undef, %entry ]
  %0 = phi i32 [ %inc, %for.inc ], [ undef, %entry ]
  %inc = add nsw i32 %0, 1
  %conv = sitofp i32 %conv17 to double
  %1 = tail call double @llvm.fmuladd.f64(double 0.000000e+00, double -0.000000e+00, double %conv)
  %conv1 = fptosi double %1 to i32
  %cmp = icmp eq i32 %0, 0
  br i1 %cmp, label %for.cond.for.end_crit_edge, label %for.inc

for.cond.for.end_crit_edge:                       ; preds = %for.inc
  store i32 %conv1, i32* getelementptr inbounds (%struct.U, %struct.U* @__dtoa_d, i32 0, i32 0), align 4
  ret void
}

; Function Attrs: nofree nosync nounwind readnone speculatable willreturn
declare double @llvm.fmuladd.f64(double, double, double) #1

attributes #0 = { "target-features"="+spe,-altivec,-bpermd,-crypto,-direct-move,-extdiv,-htm,-isa-v206-instructions,-isa-v207-instructions,-isa-v30-instructions,-power8-vector,-power9-vector,-privileged,-rop-protect,-vsx" }
attributes #1 = { nofree nosync nounwind readnone speculatable willreturn }
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9WEuT4jgS_jXURSHCmAKKQx141Qwx9SCgumfn5JBtGTRtW15Jrmrm1--XsqFMN7U7MYclCGOnUql8fPkwsU6P97PMScPqam9Eqso9cwfJHoyU892SxcJKZo_WyYK9K3dgef5WsMFtP-gPe-GCrZl1wjiZMislbZbGaGMbXhJU6XdpqsRWksW1ylPbG856wbIXnK7joP36x3X5JnKVss1mwRavW5ZrXfXCQbP45Xm7mi1-nc0fV0x-l0lN5wrHeuFDbQ2u1iS4Jrp0RsW4I2V5ZfSfMnHtI_34tVdh9pKoG9Jws6C7zQJnPuJI20-qCpoOJtPz6ZvH1Wy3YraOC-WYgDl7ZmSljWNOs4NzlbctfMAXa7afwYexTfva7Ek3vw83TJQpU2WS16n0LkqMsAd4OvnmjEgkubWCYKMTaS15VtemIdNOYa1OlCDTTV0ymxhVuX6j4s5BCEvrojp7Oegz_9kYjfgWDFbXhSwd6cqSXCBkPEkGjMNlVd6NF6_Lb6V-L3lrBwWdcQkjuI7_ZJwXRubiO8dVJ8IpXVrGU2VFnEu_B4JzKQwX1vFYZtpITkZKGMELoSBYgbMUhWT71GkR0aWfMC-4FckLncqcQOYUrWSwQfJKqxKY7Q2XpS5xjldEphzQEZZQyLOs4h4HApEfLnUJUqm50XVJGMf5wCcvwGKdqROnTbNZwoasLt9VmXJHlsBPyxDe8WjhSVUzOQqCMyGTwtVGAoJzgvg1MnAKy6vckfq5Fo6LWLGDMOQGn07wPfi5TUTeOE-RMT6T4Dz-LkzpjUolcMVVmWn-DQpCM_ilTEXunZCCL-Nv0lj4DWu37Ya9NNzVJAHEfRrDwESDTewlXFRUKm88nSpyKAB60AXQ9pAqShaE-kdSk2UUQfy0eOl_4OacYbgiZCge_CBFCi1SWcG9S_b8EkW7xWK3Xp6etueHxx39RNFyvn5-XW0fZotVtNmuv85eV7Swfl69jj3HbPHYXdi87Nb_ip7Wu9fZb54w3778tnqOlqtds7x9fZpt6BaUaP5l_fi6fqbHPzzxeRctUFrWz7_Q0-6Pp_nLY_R1td2tX5498QUg-B0IAoyBHf6XNJrnstwTjIgui8odeYx62jwDVoSzKq8tIuYaYl3WSGjuUcffhFEU7nY_RRv-b1niGniQPzI5UTud670CUnzshJEXklE865ZCayXKCyDN5b9roNsdL3gB84QC355f1gUp1uLngpOSMefuWMlUZs2KSFOD6sR1hoOQ0ykvZBGjjTTGo_wnh-69l98QvpWGanKhUcJISyQ09R_-Dqw4AvW-rKdToLSB-_8BolmTarmiwj6go11um8qD41SpnIL91HFIRZhL-jtJVYOFTWGxal9SZJHWIMCCpJuJ_bCPCvvmd6i_JKeuZrsEm1fYRk6FICAwin5ZLKJfZ19X0fL32fYhjBYP62i2e4I0SPrOkk7J5Hd30_Au6SdNxR-0Fb83XEid9YYrBidbeBidkmqvzhgV3oY5bJkXMJbtZYmyQJ5uFoft4rYufQGq0HtQ0iYPJ-RsiPAkSpQStN8JAwleq3MqfJNrCoaTtlPdfiK6bca-9_tGzL5Ko7JjK_2MWTz3boPIi6f7a7NEc309KMtQjNGddO1btXUqz1ks0cMRRyRXO9ogYEd09ARpwwg6OOQuHCd3YTZMB3APyUG7ztHPMPcgv2XaC6f97mFbmdYJOrOT4ElodoKMBTtBIZx-Nv0s2mc_PfyPvswZ313tcJ_0JJSuTiwKVZ6QcsropgWy3mTe0BmjioVUbJ97kyX7cn6itcbxkToTv5xIH7tSXVPhOtHteeFNY8A7he4OTumejPpKPiPm4fzjnHDuvxeszDOG4_PJ4ZQD7mir8AcLsDq7cjrtUxltPQlnVFOwY0DxOfMwFqMrf-vsgxvO_vgvgOsDXOfcvx7tPG8JMPHJJwy6H6lwmTZNqE7obsbAiHLXz0wNf_gzf9hG16OBpcJhrDgS9tsdK15AMYwkuA5Df-FqfIub8S0vQflBQovAdveVAbH9Pe87YXnUAKv_xe8ltFH4mBqGHV8211MuR6nnld_REkqRM996IhQJWJxGVCDZPtcxVjri_WicowKz265QQFthMEqtjrwY5oHXKRsee1dO6IXD4ANoKAfmeI4kwQIlIJZeA6C1j1G-e-qJNGxR9Hc-hAOM_KltnXyWC8Pw1GhwQmE4ojY9mHje6qAaf47m55V2VysDS0tPAQeGX5l1hfrFD8HBNZkfevwDiZ4dMuFXVtr3Ri4Ooi2DH0zyjFY5nVUnvtZSFO2mmnR2DBpQCZWj0CLl2nKD8NJM3c-KOseh_QzADu_axaAf-A8GgHngdWgX-KcrrRKd0nBSy5-fVU5b1WEekLLQvstdVJ5X0Y3894UPgg6q1KDlpoULiOE8WIIb9O8IL3wukule_sR2BYmf7PwUnJ8isVXTYmCRF9EhLcheFFsUC4luChxUDuaUMb1t2aZKXyTrxeOMdbK_lcaCzs30p_xmaNPOp_OPBflcVs8zysw54192S-1fSkttjwBlqZu3PEgSqX-LREVLgBn_1oeBIM9xBsaGUy1BT4blfwNlH-Dp3k2pqgy6WgpH_1LUGBXagkMOn1DKhZeN3FJhpbE3bDo6xOJl1SmMj3QbV9IU5DiemCPgSHcYlDFbYoR989wop6l6o7uDK-gHb-n8LQzGeDVpAkFv752FyfWFYfAT3beDu3aUPROmXYJRb-hZe-l1NLo6Tc_0-Ga_w66PdnDplMHZKf8weOyzVn2T3g_T6XAqbpxyubynYrbZLFC82Cd_QTUz4kf3u6lNfn_5r88eHHWMnCs6fzZd_gWlrK0poA-j0e14eHO4DyajYDAdhMFdfBsEw0CMR2E6DZMgzJI0Hokbn-H2HvrBUaVECSURBIbR8kbdh0EYBqPB7eBuNAzG_dFAjGQajOLx3SgLJwJAlZhl876Hqzb7G3PvVaJ_qAjFyjr7sYgpnF5kpD8O8vG-edDmfklvRuY4K1OjkhuvwL034D-BNU_m">