Nakon godinu dana razvoja objavljeno izdanje besplatnog skupa kompajlera GCC 9.1, prvo veliko izdanje u novoj grani GCC 9.x. U skladu sa nova šema izdanja, verzija 9.0 je korištena u procesu razvoja, a neposredno prije izlaska GCC 9.1, grana GCC 10.0 se već razgranala, na osnovu koje će se formirati sljedeće značajno izdanje, GCC 10.1.
GCC 9.1 je poznat po stabilizaciji podrške za C++17 standard, nastavljanju implementacije mogućnosti budućeg C++20 standarda (kodnog naziva C++2a), uključivanju u frontend za jezik D, djelomičnoj podršci za OpenMP 5.0 , skoro potpuna podrška za OpenACC 2.5, povećanje skalabilnosti međuproceduralnih optimizacija i optimizacija u fazi povezivanja, proširenje dijagnostičkih alata i dodavanje novih upozorenja, backend-a za OpenRISC, C-SKY V2 i AMD GCN GPU.
Dodata podrška za programski jezik D. GCC uključuje frontend sa kompajlerom GDC (Gnu D Compiler) i runtime biblioteke (libphobos), koje vam omogućavaju da koristite standardni GCC za pravljenje programa u programskom jeziku D. Proces omogućavanja podrške za jezik D u GCC-u poćelo je još 2011, ali vukla se zbog potrebe usklađivanja koda sa zahtjevima GCC-a i problema s prijenosom prava intelektualne svojine na Digital Mars, koji razvija programski jezik D;
Napravljena su poboljšanja u generatoru koda. Na primjer, implementirana je upotreba različitih strategija za proširenje Switch izraza (tabela skokova, test bitova, stablo odlučivanja) ovisno o situacijama. Dodata je mogućnost transformacije linearnih funkcija koje uključuju Switch izraz koristeći optimizaciju „-ftree-switch-conversion” (na primjer, skup uslova kao što je „slučaj 2: kako = 205; prekid; slučaj 3: kako = 305; prekid ;” će biti konvertovano u "100 * kako + 5";
Poboljšane interproceduralne optimizacije. Inline postavke implementacije su prilagođene za moderne C++ baze koda i proširene novim parametrima max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns i uninlined -vreme za razmišljanje. Poboljšana preciznost i agresivnost odvajanja hladnog/vrućeg koda. Poboljšana skalabilnost za vrlo velike prevodilačke jedinice (na primjer, kod primjene optimizacije u fazi povezivanja na velike programe);
Poboljšan je mehanizam optimizacije na osnovu rezultata profilisanja koda (PGO - Profile-guided optimization), koji generiše optimalniji kod na osnovu analize karakteristika izvršavanja koda. Opcija sažetka "-fprofile-use" sada uključuje modove optimizacije "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" i "-ftree-loop-distribution". Uklonjeno je uključivanje histograma sa brojačima u fajlove, što je smanjilo veličinu fajlova sa profilima (histogrami se sada generišu u hodu prilikom izvođenja optimizacija tokom povezivanja);
Poboljšane optimizacije vremena povezivanja (LTO). Pojednostavljenje tipova je omogućeno prije generiranja rezultata, što je omogućilo značajno smanjenje veličine LTO objektnih datoteka, smanjenje potrošnje memorije u fazi povezivanja i poboljšanje paralelizacije operacija. Broj particija (-param lto-partitions) je povećan sa 32 na 128, što poboljšava performanse na sistemima sa velikim brojem CPU niti. Dodan je parametar za kontrolu broja procesa optimizacije
"-param lto-max-streaming-parallelism";
Kao rezultat toga, u poređenju sa GCC 8.3, optimizacije uvedene u GCC 9 dozvoljeno smanjiti vrijeme kompilacije Firefox 5 i LibreOffice 66 za oko 6.2.3%. Veličina objektnih datoteka smanjena je za 7%. Vrijeme povezivanja na 8-jezgrenom CPU-u smanjeno je za 11%. Faza sekvencijalne optimizacije faze povezivanja sada je 28% brža i troši 20% manje memorije. Potrošnja memorije svakog procesora paralelizovane faze LTO smanjena je za 30%;
Većina specifikacija paralelnog programiranja implementirana je za jezike C, C++ i Fortran OpenACC 2.5, koji definiše alate za preuzimanje operacija na GPU-ovima i specijalizovanim procesorima kao što je NVIDIA PTX;
Delimična podrška za standard je implementirana za C i C++ Otvorite MP 5.0 (Open Multi-Processing), koji definira API i metode primjene metoda paralelnog programiranja za C, C++ i Fortran jezike na višejezgrenim i hibridnim (CPU+GPU/DSP) sistemima sa zajedničkom memorijom i jedinicama vektorizacije (SIMD) ;
Dodata su nova upozorenja za jezik C: "-Saddress-of-packed-member" (vrijednost neusklađenog pokazivača na upakovani član strukture ili unije) i
«-Wapsolutna vrijednost" (kada pristupate funkcijama za izračunavanje apsolutne vrijednosti, ako postoji prikladnija funkcija za navedeni argument, na primjer, fabs(3.14) treba koristiti umjesto abs(3.14). Dodata su nova upozorenja za C++: "-Wdeprecated-copy",
"-Winit-list-lifetime", "-Wredundant-move", "-Wpesimizing-move" i "-Wclass-conversion". Mnoga ranije dostupna upozorenja su proširena;
Dodata eksperimentalna podrška za dio budućeg standarda jezika C, kodnog naziva C2x. Da biste omogućili podršku za C2x, koristite opcije "-std=c2x" i "-std=gnu2x" (da biste omogućili GNU ekstenzije). Standard je još uvijek u ranoj fazi razvoja, stoga je od njegovih mogućnosti podržan samo izraz _Static_assert sa jednim argumentom (_Static_assert sa dva argumenta je standardizovan u C11);
Podrška za C++17 standard je proglašena stabilnom. U frontendu, jezičke mogućnosti C++17 su u potpunosti implementirane, au libstdc++, bibliotečke funkcije definirane u standardu su blizu punoj implementaciji;
Nastavljeno implementacija elementi budućeg C++2a standarda. Na primjer, dodata je mogućnost uključivanja raspona tokom inicijalizacije, implementirane su ekstenzije za lambda izraze, dodata je podrška za prazne članove struktura podataka i vjerovatne/nevjerovatne atribute, omogućena je mogućnost pozivanja virtualnih funkcija u uvjetnim izrazima , itd.
Da biste omogućili podršku za C++2a, koristite opcije "-std=c++2a" i "-std=gnu++2a". Dodane datoteke zaglavlja bitova i verzije u libstdc++ za C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible i std::type_identity osobine, std::midpoint, funkcije std::midpoint, , std::bind_front,
std::visit, std::is_constant_evaluated i std::assume_aligned, dodana podrška za tip char8_t, implementirana mogućnost provjere prefiksa i sufiksa stringova (počinje_sa, završava_sa);
Dodata podrška za nove ARM procesore
Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE i Neoverse N1. Dodata podrška za uputstva uvedena u Armv8.3-A za rad sa kompleksnim brojevima, generisanje pseudoslučajnih brojeva (rng) i označavanje memorije (memtag), kao i uputstva za blokiranje napada koji se odnose na spekulativno izvršenje i rad jedinice za predviđanje grananja . Za arhitekturu AArch64, dodat je način zaštite sjecišta steka i gomile (“-fstack-clash-protection”). Za korištenje karakteristika Armv8.5-A arhitekture, dodana je opcija “-march=armv8.5-a”
Uključuje pozadinu za generiranje koda za AMD GPU-ove zasnovane na GCN mikroarhitekturi. Implementacija je trenutno ograničena na kompilaciju jednonitnih aplikacija (podrška za izvođenje višenitnih kalkulacija putem OpenMP-a i OpenACC-a će biti ponuđena kasnije) i podršku za GPU Fiji i Vega 10;
Dodan backend za procesore C-SKY V2, koju proizvodi istoimena kineska kompanija za razne potrošačke uređaje;
Sve opcije komandne linije koje upravljaju vrijednostima bajtova podržavaju sufikse kb, KiB, MB, MiB, GB i GiB;
Implementirano opcija “-flive-patching=[inline-only-static|inline-clone]” vam omogućava da postignete sigurnu kompilaciju za sisteme za zakrpe uživo zbog kontrole na više nivoa nad upotrebom međuproceduralnih (IPA) optimizacije;
Dodata opcija "--completion" za detaljnu kontrolu završetka opcije kada se koristi bash;
Dijagnostički alati pružaju prikaze izvoda izvornog teksta koji ukazuju na broj reda i vizuelno označavaju povezane informacije, kao što su tipovi operanda. Da biste onemogućili prikaz brojeva linija i oznaka, dostupne su opcije “-fno-diagnostics-show-line-numbers” i “-fno-diagnostics-show-labels”;
Prošireno alati za dijagnosticiranje grešaka u C++ kodu, poboljšana čitljivost informacija o uzrocima grešaka i isticanje problematičnih parametara;
Dodata opcija “-fdiagnostics-format=json”, koja omogućava generisanje dijagnostičkog izlaza u mašinski čitljivom formatu (JSON);
Dodane su nove opcije profiliranja “-fprofile-filter-files” i “-fprofile-exclude-files” za odabir izvornih datoteka koje će se obraditi;
AddressSanitizer obezbeđuje generisanje kompaktnijeg verifikacionog koda za automatske varijable, što smanjuje potrošnju memorije izvršne datoteke koja se proverava;
Poboljšan izlaz u "-fopt-info» (detaljne informacije o dodatnim optimizacijama). Dodati novi prefiksi "optimizirano" i "propušteno", pored prethodno dostupnog prefiksa "napomena". Dodati izlaz informacija o donošenju odluka o inline-otkrivanju i vektorizaciji ciklusa;
Dodata opcija “-fsave-optimization-record”, kada je navedena, GCC sprema datoteku SRCFILE.opt-record.json.gz sa opisom odluka o korištenju određenih optimizacija. Nova opcija se razlikuje od “-fopt-info” moda tako što uključuje dodatne metapodatke, kao što su informacije o profilu i inline lancima;
Dodane opcije “-fipa-stack-alignment” i “-fipa-reference-addressable” za kontrolu poravnanja steka i korištenje načina adresiranja (samo za pisanje ili točno čitanje) za statičke varijable tokom međuproceduralnih optimizacija;
Potpuna podrška za asinhroni ulaz/izlaz je implementirana za jezik Fortran;
Podrška za Solaris 10 (*-*-solaris2.10) i Cell/BE (Cell Broadband Engine SPU) platforme je zastarjela i bit će uklonjena u sljedećem velikom izdanju. Podrška za Armv2, Armv3, Armv5 i Armv5E arhitekture je ukinuta. Podrška za Intel MPX (Memory Protection Extensions) je ukinuta.