Hur identifiera bortoptimerad kod?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45265
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Hur identifiera bortoptimerad kod?

Inlägg av TomasL »

Har flera gånger råkat ut för att kompilatorn (gcc (MC32)) optimerar bort valid kod, vilket naturligtvis får resterande kod att inte fungera.
Till exempel:

Kod: Markera allt

void u2str( char *str, unsigned short n, unsigned char opt){
	register int i;
	unsigned char r;
	
	unsigned char dot;
	unsigned char adj;
	unsigned short tmp;

	str[6] = 0;
	if( opt & I2STR_ADDSPACE) {
		str[6] = 32;
		str[7] = 0;
	}

	i = 5;
	dot = (opt-1) & 7;	// dot pos
//	opt = (opt - (unsigned char)32) >>(unsigned char)5;  // number of right pos
	opt = opt - (unsigned char)32; 
	opt = opt >> (unsigned char)5; 

	while	(i < 10u){
		tmp = n;
		n/= (unsigned short)10u;
		r = tmp - n * (unsigned short)10u;
//		r = n % (unsigned char)10u;

		if( dot == i) {
			str[i] = i2str_dot;
			i--;
		}
		str[i] = r + 48u; //

		if( n == 0u ) {
			if( dot > i ) {

				if(i > 0) {
					r = i - opt;
					if(r > 128) r = 0;
					adj = r;
					while(i < 7u) {
						str[r] = str[i];
						i++;
						r++;
					}

					while(adj) { // fill spaces before numbers
						adj--;
						str[adj] = i2str_fill;
					}
				}

				return;
			}
		} // end if( n==0u ) 

		i--;
	} // end while	(i < 10u)
}
i ovanstående kod plockade kompilatorn bort raden

Kod: Markera allt

adj = r;
Vilket naturligtvis innebar att:

Kod: Markera allt

while(adj) { // fill spaces before numbers
						adj--;
						str[adj] = i2str_fill;
					}
Aldrig kan köras.

Hur i helsike skall man kunna spåra sånt?
Man kan ju naturligtvis deklarera alla variabler som volatila, men det skall ju knappast behövas.
Någon som har ideér?
hummel
Inlägg: 2267
Blev medlem: 28 november 2009, 10:40:52
Ort: Stockholm

Re: Hur identifiera bortoptimerad kod?

Inlägg av hummel »

Tycker det ser ut som en bugg i optimeringen av kompilatorn.
Nerre
Inlägg: 26697
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Hur identifiera bortoptimerad kod?

Inlägg av Nerre »

Det jag reagerar på är att adj bara verkar tilldelas ett värde när if-satsen if(i >0) är sann? Om if-satsen är falsk kommer adj aldrig få ett värde?

Nu vet jag iofs inte varför kompilatorn får för sig att optimera bort tilldelningen på grund av det...

Men generellt är det ju sån där röra med nästade if-satser som oftast ligger bakom bortoptimerad kod, eftersom kompilatorn kommer fram till att "det här kommer aldrig användas".

Har du testat att slå av all optimering?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45265
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur identifiera bortoptimerad kod?

Inlägg av TomasL »

Spelar ingen roll om det är en massa nestade if-satser, kompilatorn får inte optimera bort kod, oavsett, möjligen ge en varning att den tror att raden är onödig.
Polyene
Inlägg: 20
Blev medlem: 29 juli 2018, 09:31:40

Re: Hur identifiera bortoptimerad kod?

Inlägg av Polyene »

Min gissning är att kompilatorn har analyserat vad du skickar in som argument och kommit fram till att den delen aldrig behövs.

Om inkommande värde på opt alltid har ett relativt lågt värde, så kommer opt - 32 bli ett stort värde, vilket sen efter opt >> 5 ändå kan göra så att opt alltid är större än i på rad 37 när du gör r = i - opt. Då blir r större än 128, vilket gör att r blir 0 på rad 38, vilket leder till att adj också blir 0 och while(adj)-loopen aldrig kommer att köras, och därför inte behövs.
Användarvisningsbild
mankan
EF Sponsor
Inlägg: 908
Blev medlem: 18 juli 2015, 11:23:22
Ort: Linköping

Re: Hur identifiera bortoptimerad kod?

Inlägg av mankan »

Just för nästlade if-satser har jag råkat ut för GCC-buggar när -Os användes på Linuxkärnan. Oklart om buggen var beroende av målmiljön (SH4) eller det var generellt. Nu var detta ett tag sedan, kanske gcc 3,x eller tidig gcc 4. Lösningen var att köra -O2 plus alla flaggor som -Os lade på normalt lägger på. Så mao var buggen i det specifika som just -Os gjorde.

Jag hade börjat att labba med kompileringsflaggor.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45265
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur identifiera bortoptimerad kod?

Inlägg av TomasL »

En fundering vi har är att debuggern kanske är rätt korkad.
Eftersom det är en MIPS-processor, så funkar den väldigt mycket annorlunda jämfört med vanliga processorer.
Det kan vara så att den behåller variabeln i ett register för senare användning, och debuggern inte fattar det.
Får kolla i morgon, plocka bort volitile och se vad som händer egentligen.
Vi kör med O1 på det mesta, skall även testa utan optimering, kan iofs vara så att den filen inte är optimerad, eftersom det går att stega genom koden.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45265
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur identifiera bortoptimerad kod?

Inlägg av TomasL »

Oavsett, åter till frågan hur skall man kunna hitta det som kompilatorn får för sig att optimera bort.
Det är ju inte helt enkelt att gå igenom assemblerlistningen och jämföra med C-filerna, speciellt om man har någon miljon rader källkod.
ToPNoTCH
Inlägg: 4872
Blev medlem: 21 december 2009, 17:59:48

Re: Hur identifiera bortoptimerad kod?

Inlägg av ToPNoTCH »

Skulle inte förvåna mig om den blir kvar efter optimeringen om du definierar den som uint8_t

Här kan vara något att kolla https://www.arm.linux.org.uk/docs/faqs/signedchar.php
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45265
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur identifiera bortoptimerad kod?

Inlägg av TomasL »

Att kompilatorn gör fel osv, händer, men hur i helsike skall man kunna hitta det.
Skall kontrollera lite mer i morgon, gissar att man får göra en buggrapport till gcc.
Polyene
Inlägg: 20
Blev medlem: 29 juli 2018, 09:31:40

Re: Hur identifiera bortoptimerad kod?

Inlägg av Polyene »

Prova att lägga till ett dummy-anrop till funktionen någonstans där du sätter opt till 32 och se om det förändringar saker och ting. Jag har flera gånger varit övertygad om att kompilatorn gjort fel, för att sedan upptäcka att den faktiskt istället gjort någonting riktigt smart.

Kompilatorn har all rätt att ta bort kod som den ser aldrig kommer att användas, då det inte påverkar resultatet av körningen.

Sen är det ju alltid problem om man försöker stega sig igenom optimerad kod, eftersom det inte behöver finnas specifik i kod genererad för varje källkodsrad, och variabler kan flytta mellan register och stack lite hursomhelst.
guckrum
Inlägg: 1683
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Hur identifiera bortoptimerad kod?

Inlägg av guckrum »

Oavsett, åter till frågan hur skall man kunna hitta det som kompilatorn får för sig att optimera bort.
Ja det är ju ett forskningsområde i sig själv inom datavetenskapen, "compiler correctness". Det finns egentligen bara två fundamentala angreppssätt: formell verifiering respektive testning. Hårda bud.
MIPS är väl en av de mera välstuderade arktitekturerna, den är gammal och föredömligt enkel. Har du kollat att optimeringen inte kommer av externa faktorer som någon var inne på tidigare? Eller så gör den helt enkelt fel.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hur identifiera bortoptimerad kod?

Inlägg av sodjan »

> Oavsett, åter till frågan hur skall man kunna hitta det som kompilatorn får för sig att optimera bort.

Min C kompilator kan man be om en kommenterat källkodslista där varje optimering
är angiven med radnummer och åtgärd i klartext.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45265
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur identifiera bortoptimerad kod?

Inlägg av TomasL »

Källkodslistan är kommenterad, men som sagt, någon miljon rader C-kod, så är det inte möjligt att kolla så varenda rad har genererat kod.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hur identifiera bortoptimerad kod?

Inlägg av sodjan »

Njae, alltså bara där kompilatorn har rapporterat en "optimering".
Inte att kolla alla rader.
Skriv svar