param([Int32]$ABBA_Time = 5, #hours [Bool]$ABBA_Only = $False) $root = $PWD -replace '\\', '/' if (Test-Path "$root/stop") { Remove-Item -Path "$root/stop" } # Validate Ninja ninja --version | grep 1.9.0.UBI_1 IF ($lastexitcode -ne 0) { Write-Host "You need ninja 1.9.0.UBI_1 (custom version with proper processor # detection - see Ninja PR 1674)" exit } #Validate Visual Studio cmd if (-not (Test-Path env:VSCMD_VER)) { Write-Host "Not running inside a Visual Studio cmd" exit } $Env:VSCMD_VER | grep "15." if ($lastexitcode -eq 0) { #Validate VS2017 cl 2>&1 | %{ "$_" } | grep -E "19.16.27034 (.+) x64" IF ($lastexitcode -ne 0) { Write-Host "Please upgrade VS2017 to 15.9.17" exit } } else { $Env:VSCMD_VER | grep "16." if ($lastexitcode -eq 0) { #Validate VS2019 cl 2>&1 | %{ "$_" } | grep -E "19.23.28107 (.+) x64" IF ($lastexitcode -ne 0) { Write-Host "Please upgrade VS2017 to 16.3.10" exit } } else { Write-Host "Unsupported Visual Studio version" exit } } #Validate LLVM & 'C:\Program Files\LLVM\bin\clang-cl' --version | grep "clang version 9.0.0 (tags/RELEASE_900/final)" IF ($lastexitcode -ne 0) { Write-Host "Please upgrade LLVM to 9.0.0" exit } # Checkout from Fri Nov 22 09:07:55 2019 $Checkout = 'cb15ba84fe7ca289ae561b0e770e7219da40e807' $PatchName = 'clang_bypass_cc1.patch' git checkout . git pull git checkout $Checkout function PrepareFolder([string]$path) { if (Test-Path $path) { Remove-Item -Path $path -Recurse -force } New-Item -Path $path -ItemType "directory" Set-Location -Path $path } $cmake_opts = "-DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_ENABLE_PROJECTS=""clang;lld;llvm""" $stage_opts = "-DCMAKE_C_COMPILER=""{0}/bin/clang-cl.exe"" -DCMAKE_CXX_COMPILER=""{0}/bin/clang-cl.exe"" -DCMAKE_LINKER=""{0}/bin/lld-link.exe"" -DLLVM_ENABLE_LLD=true" $stage_opts_MSVC = "-DCMAKE_C_COMPILER=""{0}/bin/Hostx64/x64/cl.exe"" -DCMAKE_CXX_COMPILER=""{0}/bin/Hostx64/x64/cl.exe"" -DCMAKE_LINKER=""{0}/bin/Hostx64/x64/link.exe""" $cmake_MT = "-DLLVM_USE_CRT_RELEASE=MT" $cmake_GS = "-DCMAKE_CXX_FLAGS=""/GS-"" -DCMAKE_C_FLAGS=""/GS-""" $cmake_Skylake = "-DCMAKE_CXX_FLAGS=""-march=skylake-avx512"" -DCMAKE_C_FLAGS=""-march=skylake-avx512""" $cmake_extraSkylake = "-DLLVM_USE_CRT_RELEASE=MT -DCMAKE_CXX_FLAGS=""-march=skylake-avx512 /GS-"" -DCMAKE_C_FLAGS=""-march=skylake-avx512 /GS-""" $cmake_ultraSkylake = "-DLLVM_USE_CRT_RELEASE=MT -DCMAKE_CXX_FLAGS=""-march=skylake-avx512 /GS-"" -DCMAKE_C_FLAGS=""-march=skylake-avx512 /GS- -Xclang -O3 -Xclang -fwhole-program-vtables -fstrict-aliasing"" -DLLVM_ENABLE_LTO=THIN" $cmake_AVX = "-DCMAKE_CXX_FLAGS=""/arch:AVX"" -DCMAKE_C_FLAGS=""/arch:AVX""" $cmake_extraAVX = "-DLLVM_USE_CRT_RELEASE=MT -DCMAKE_CXX_FLAGS=""/arch:AVX /GS-"" -DCMAKE_C_FLAGS=""/arch:AVX /GS-""" $cmake_ultraAVX = "-DLLVM_USE_CRT_RELEASE=MT -DCMAKE_CXX_FLAGS=""/arch:AVX /GS-"" -DCMAKE_C_FLAGS=""/arch:AVX /GS- -Xclang -O3 -Xclang -fwhole-program-vtables -fstrict-aliasing"" -DLLVM_ENABLE_LTO=THIN" IF ($ABBA_Only -eq $false) { function PrepareClang10([string]$where, [string]$extra_opts) { PrepareFolder "$root/stage1" $compiler = "C:/Program Files/LLVM" Invoke-Expression "cmake -GNinja $root/llvm/ $extra_opts $cmake_opts $($stage_opts -f $compiler)" ninja all Set-Location -Path $root PrepareFolder "$where" $compiler = "$root/stage1" Invoke-Expression "cmake -GNinja $root/llvm/ $extra_opts $cmake_opts $($stage_opts -f $compiler)" ninja all Set-Location -Path $root } function PrepareClang10_PGO([string]$where, [string]$extra_opts) { $cmake_opts_withCompilerRT = "-DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_LIBXML2=OFF -DLLVM_ENABLE_PROJECTS=""clang;lld;llvm;compiler-rt""" PrepareFolder "$root/stage1" $compiler = "$root/__clang10" Invoke-Expression "cmake -GNinja $root/llvm/ $extra_opts $cmake_opts_withCompilerRT $($stage_opts -f $compiler)" ninja all Set-Location -Path $root $noTblGen = "-DCLANG_TABLEGEN=""$root/stage1/bin/clang-tblgen"" -DLLVM_TABLEGEN=""$root/stage1/bin/llvm-tblgen""" PrepareFolder "$root/stage2" $compiler = "$root/stage1" Invoke-Expression "cmake -GNinja $root/llvm/ $noTblGen $extra_opts $cmake_opts $($stage_opts -f $compiler) -DLLVM_BUILD_INSTRUMENTED=IR -DLLVM_BUILD_RUNTIME=No" ninja all Set-Location -Path $root PrepareFolder "$root/stage3" $compiler = "$root/stage2" Invoke-Expression "cmake -GNinja $root/llvm/ $noTblGen $extra_opts $cmake_opts $($stage_opts -f $compiler)" ninja check-all bin\llvm-profdata merge -output=profdata.prof profiles\*.profraw Set-Location -Path $root PrepareFolder "$where" $compiler = "$root/stage1" Invoke-Expression "cmake -GNinja $root/llvm/ $noTblGen $extra_opts $cmake_opts $($stage_opts -f $compiler) -DLLVM_PROFDATA_FILE=$root/stage3/profdata.prof" ninja all Set-Location -Path $root } # First build a 2-stage Clang 10 PrepareClang10 "$root/__clang10" #PrepareClang10 "$root/__clang10.MT" $cmake_MT #PrepareClang10 "$root/__clang10.GSmin" $cmake_GS #PrepareClang10 "$root/__clang10.skylake" $cmake_Skylake #PrepareClang10 "$root/__clang10.MT.skylake.GSmin" $cmake_extraSkylake #PrepareClang10 "$root/__clang10.MT.skylake.GSmin.O3.thinlto" $cmake_ultraSkylake #PrepareClang10_PGO "$root/__clang10.MT.skylake.GSmin.O3.thinlto.pgo" $cmake_ultraSkylake #PrepareClang10 "$root/__clang10.avx" $cmake_AVX #PrepareClang10 "$root/__clang10.MT.avx.GSmin" $cmake_extraAVX #PrepareClang10 "$root/__clang10.MT.avx.GSmin.O3.thinlto" $cmake_ultraAVX #PrepareClang10_PGO "$root/__clang10.MT.avx.GSmin.O3.thinlto.pgo" $cmake_ultraAVX git apply $PatchName PrepareClang10 "$root/__clang10.cc1bypass" #PrepareClang10 "$root/__clang10.cc1bypass.MT" $cmake_MT #PrepareClang10 "$root/__clang10.cc1bypass.GSmin" $cmake_GS #PrepareClang10 "$root/__clang10.cc1bypass.skylake" $cmake_Skylake #PrepareClang10 "$root/__clang10.cc1bypass.MT.skylake.GSmin" $cmake_extraSkylake #PrepareClang10 "$root/__clang10.cc1bypass.MT.skylake.GSmin.O3.thinlto" $cmake_ultraSkylake #PrepareClang10_PGO "$root/__clang10.cc1bypass.MT.skylake.GSmin.O3.thinlto.pgo" $cmake_ultraSkylake #PrepareClang10 "$root/__clang10.cc1bypass.avx" $cmake_AVX #PrepareClang10 "$root/__clang10.cc1bypass.MT.avx.GSmin" $cmake_extraAVX #PrepareClang10 "$root/__clang10.cc1bypass.MT.avx.GSmin.O3.thinlto" $cmake_ultraAVX #PrepareClang10_PGO "$root/__clang10.cc1bypass.MT.avx.GSmin.O3.thinlto.pgo" $cmake_ultraAVX } git apply $PatchName $compilerVS2019 = "C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/VC/Tools/MSVC/14.23.28105" $compilerClang9 = "C:/Program Files/LLVM" $compilerVS2017 = "C:/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.16.27023" function LaunchABBARun([string]$A, [string]$CompilerA, [string]$B, [string]$CompilerB) { $save_opts = $stage_opts if ($CompilerA -Match "MSVC") { $stage_opts = $stage_opts_MSVC } PrepareFolder "$root/buildA" $compiler = $CompilerA Invoke-Expression "cmake -GNinja $root/llvm/ $cmake_extraAVX $cmake_opts $($stage_opts -f $compiler)" Set-Location -Path $root PrepareFolder "$root/buildB" $compiler = $CompilerB Invoke-Expression "cmake -GNinja $root/llvm/ $cmake_extraAVX $cmake_opts $($save_opts -f $compiler)" Set-Location -Path $root # Do AB/BA testing $ABBA_Time_StartTime = Get-Date $ABBA_Time_End = (Get-Date) + (New-TimeSpan -Hours $ABBA_Time) $Iteration = 1 $Cumul_A = New-TimeSpan $Cumul_B = New-TimeSpan $Values_A = @() $Values_B = @() Write-Host "`n`n`n Tests will run for at least " $ABBA_Time " Hours`n" Write-Host "Started at " (Get-Date) "`n`n" function Display($Val) { "{0,17}" -f $Val } function DisplayTicks($Val) { Display $([TimeSpan]::FromTicks($Val)) } function RunTest([ref]$Cumul, [ref]$Vals, [String]$path) { Set-Location -Path "$root/$path" ninja clean $T = Measure-Command { ninja } #$T = Measure-Command { dir -s } $Cumul.Value = $Cumul.Value.add( $T ) $Vals.Value += $T.Ticks Display($T) Set-Location -Path $root } $FlipFlop = $True Do { Write-Host "**************** Iteration: " $Iteration "`n`n" if ($FlipFlop -eq $True) { $A RunTest ([ref]$Cumul_A) ([ref]$Values_A) "buildA" Write-Host "`n" $B RunTest ([ref]$Cumul_B) ([ref]$Values_B) "buildB" $FlipFlop = $False } else { $B RunTest ([ref]$Cumul_B) ([ref]$Values_B) "buildB" Write-Host "`n" $A RunTest ([ref]$Cumul_A) ([ref]$Values_A) "buildA" $FlipFlop = $True } $Iteration++ Write-Host "Running for " ((Get-Date) - $ABBA_Time_StartTime) "`n" if ([System.IO.File]::Exists("$root/stop")) { break } } While ((Get-Date) -lt $ABBA_Time_End) $Iteration-- function WriteHostAndLog([string]$Str) { Write-Host $Str Add-Content result.txt $Str } function Finalize($Vals, $Cumul, $Which, [ref]$Min, [ref]$Max, [ref]$Mean, [ref]$Median, [string]$TestName) { $Min.Value = ($Vals | Measure -Minimum).Minimum $Mean.Value = $Cumul.Ticks / $Iteration $Sorted = $Vals | sort IF ($Sorted.Length -eq 1) { $Median.Value = $Sorted[0] } ELSE { IF ($Sorted.Length % 2 -eq 0) { $Median.Value = ($Sorted[$Sorted.Length / 2] + $Sorted[($Sorted.Length / 2) - 1]) / 2 } ELSE { $Median.Value = $Sorted[$Sorted.Length / 2] } } $Max.Value = ($Vals | Measure -Maximum).Maximum WriteHostAndLog $($Which + " | " + $(DisplayTicks($Min.Value)) + " | " + $(DisplayTicks($Mean.Value)) + " | " + $(DisplayTicks($Median.Value)) + " | " + $(DisplayTicks($Max.Value)) + " | " + $TestName) } WriteHostAndLog "****************************************************************" WriteHostAndLog $("Total iterations: " + $Iteration + "`n") WriteHostAndLog " | Min | Mean | Median | Max |" $Min_A = New-TimeSpan $Max_A = New-TimeSpan $Mean_A = New-TimeSpan $Median_A = New-TimeSpan Finalize $Values_A $Cumul_A " A" ([ref]$Min_A) ([ref]$Max_A) ([ref]$Mean_A) ([ref]$Median_A) $A $Min_B = New-TimeSpan $Max_B = New-TimeSpan $Mean_B = New-TimeSpan $Median_B = New-TimeSpan Finalize $Values_B $Cumul_B " B" ([ref]$Min_B) ([ref]$Max_B) ([ref]$Mean_B) ([ref]$Median_B) $B $DiffMin = $Min_B - $Min_A $DiffMax = $Max_B - $Max_A $DiffMean = $Mean_B - $Mean_A $DiffMedian = $Median_B - $Median_A WriteHostAndLog $("Diff | " + $(DisplayTicks($DiffMin)) + " | " + $(DisplayTicks($DiffMean)) + " | " + $(DisplayTicks($DiffMedian)) + " | " + $(DisplayTicks($DiffMax)) + " |") } LaunchABBARun "Clang 10.0" "$root/__clang10" ` "Clang 10.0 + cc1 bypass" "$root/__clang10.cc1bypass" #LaunchABBARun "Clang 10.0 MT" "$root/__clang10.MT" ` # "Clang 10.0 MT + cc1 bypass" "$root/__clang10.cc1bypass.MT" #LaunchABBARun "Clang 10.0 GS-" "$root/__clang10.GSmin" ` # "Clang 10.0 GS- + cc1 bypass" "$root/__clang10.cc1bypass.GSmin" #LaunchABBARun "Clang 10.0 skylake" "$root/__clang10.skylake" ` # "Clang 10.0 skylake + cc1 bypass" "$root/__clang10.cc1bypass.skylake" #LaunchABBARun "Clang 10.0 MT skylake GS-" "$root/__clang10.MT.skylake.GSmin" ` # "Clang 10.0 MT skylake GS- + cc1 bypass" "$root/__clang10.cc1bypass.MT.skylake.GSmin" #LaunchABBARun "Clang 10.0 MT skylake GS- O3 thinlto" "$root/__clang10.MT.skylake.GSmin.O3.thinlto" ` # "Clang 10.0 MT skylake GS- O3 thinlto + cc1 bypass" "$root/__clang10.cc1bypass.MT.skylake.GSmin.O3.thinlto" #LaunchABBARun "Clang 10.0 ultra PGO skylake" "$root/__clang10.MT.skylake.GSmin.O3.thinlto.pgo" ` # "Clang 10.0 ultra PGO skylake + cc1 bypass" "$root/__clang10.cc1bypass.MT.skylake.GSmin.O3.thinlto.pgo" #LaunchABBARun "Clang 10.0 AVX" "$root/__clang10.avx" ` # "Clang 10.0 AVX + cc1 bypass" "$root/__clang10.cc1bypass.avx" #LaunchABBARun "Clang 10.0 MT AVX GS-" "$root/__clang10.MT.avx.GSmin" ` # "Clang 10.0 MT AVX GS- + cc1 bypass" "$root/__clang10.cc1bypass.MT.avx.GSmin" #LaunchABBARun "Clang 10.0 MT AVX GS- O3 thinlto" "$root/__clang10.MT.avx.GSmin.O3.thinlto" ` # "Clang 10.0 MT AVX GS- O3 thinlto + cc1 bypass" "$root/__clang10.cc1bypass.MT.avx.GSmin.O3.thinlto" #LaunchABBARun "Clang 10.0 ultra PGO AVX" "$root/__clang10.MT.avx.GSmin.O3.thinlto.pgo" ` # "Clang 10.0 ultra PGO AVX + cc1 bypass" "$root/__clang10.cc1bypass.MT.avx.GSmin.O3.thinlto.pgo" #LaunchABBARun "VS2017" "$compilerVS2017" ` # "Clang 9.0" "$compilerClang9" #LaunchABBARun "VS2019" "$compilerVS2019" ` # "Clang 10.0" "$root/__clang10"