From 598fc8310b71bf9d09a7c4d9588df544d9c6f3f6 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Thu, 25 Sep 2025 16:16:55 +0200 Subject: [PATCH 1/6] Add support for iOS CoreCLR scenarios --- .../runtime-ios-scenarios-perf-jobs.yml | 22 +++++++++++++++++++ eng/pipelines/templates/runtime-perf-job.yml | 13 +++++++++-- eng/pipelines/upload-build-artifacts-jobs.yml | 9 ++++++++ scripts/run_performance_job.py | 5 ++++- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/eng/pipelines/runtime-ios-scenarios-perf-jobs.yml b/eng/pipelines/runtime-ios-scenarios-perf-jobs.yml index 3daf312b4fa..67854f4a695 100644 --- a/eng/pipelines/runtime-ios-scenarios-perf-jobs.yml +++ b/eng/pipelines/runtime-ios-scenarios-perf-jobs.yml @@ -7,6 +7,7 @@ jobs: - template: /eng/pipelines/performance/templates/perf-ios-scenarios-build-jobs.yml@${{ parameters.runtimeRepoAlias }} parameters: mono: true + coreclr: true nativeAot: true # run iOS scenarios - Mono FullAOT @@ -138,3 +139,24 @@ jobs: performanceRepoAlias: ${{ parameters.performanceRepoAlias }} ${{ each parameter in parameters.jobParameters }}: ${{ parameter.key }}: ${{ parameter.value }} + + # run iOS scenarios - CoreCLR + - template: /eng/pipelines/common/platform-matrix.yml@${{ parameters.runtimeRepoAlias }} + parameters: + jobTemplate: /eng/pipelines/templates/runtime-perf-job.yml@${{ parameters.performanceRepoAlias }} + buildConfig: release + runtimeFlavor: coreclr + platforms: + - osx_x64 + jobParameters: + runtimeType: iOSCoreCLR + codeGenType: JIT + projectFile: $(Build.SourcesDirectory)/eng/testing/performance/ios_scenarios.proj + runKind: ios_scenarios + isScenario: true + logicalMachine: 'perfiphone12mini' + iOSStripSymbols: false + runtimeRepoAlias: ${{ parameters.runtimeRepoAlias }} + performanceRepoAlias: ${{ parameters.performanceRepoAlias }} + ${{ each parameter in parameters.jobParameters }}: + ${{ parameter.key }}: ${{ parameter.value }} diff --git a/eng/pipelines/templates/runtime-perf-job.yml b/eng/pipelines/templates/runtime-perf-job.yml index f33599cc46e..bd91d23e4ed 100644 --- a/eng/pipelines/templates/runtime-perf-job.yml +++ b/eng/pipelines/templates/runtime-perf-job.yml @@ -36,7 +36,7 @@ jobs: # Test job depends on the corresponding build job ${{ if eq(parameters.downloadSpecificBuild.buildId, '') }}: dependsOn: - - ${{ if not(in(parameters.runtimeType, 'AndroidMono', 'AndroidCoreCLR', 'iOSMono', 'iOSNativeAOT', 'wasm', 'mono')) }}: + - ${{ if not(in(parameters.runtimeType, 'AndroidMono', 'AndroidCoreCLR', 'iOSMono', 'iOSCoreCLR', 'iOSNativeAOT', 'wasm', 'mono')) }}: - ${{ format('build_{0}{1}_{2}_{3}_{4}', parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig, 'coreclr') }} - ${{ if and(eq(parameters.runtimeType, 'mono'), ne(parameters.codeGenType, 'AOT')) }}: - ${{ format('build_{0}{1}_{2}_{3}_{4}', parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig, 'mono') }} @@ -51,6 +51,8 @@ jobs: - ${{ 'build_android_arm64_release_AndroidCoreCLR' }} - ${{ if eq(parameters.runtimeType, 'iOSMono')}}: - ${{ 'build_ios_arm64_release_iOSMono' }} + - ${{ if eq(parameters.runtimeType, 'iOSCoreCLR')}}: + - ${{ 'build_ios_arm64_release_iOSCoreCLR' }} - ${{ if eq(parameters.runtimeType, 'iOSNativeAOT')}}: - ${{ 'build_ios_arm64_release_iOSNativeAOT' }} @@ -177,7 +179,7 @@ jobs: # artifactFileName: 'AndroidBDNApk.tar.gz' # artifactName: 'AndroidBDNApk' # displayName: 'Mono Android BDN Apk' - - ${{ elseif or(eq(parameters.runtimeType, 'iOSMono'), eq(parameters.runtimeType, 'iOSNativeAOT')) }}: + - ${{ elseif or(eq(parameters.runtimeType, 'iOSMono'), eq(parameters.runtimeType, 'iOSCoreCLR'), eq(parameters.runtimeType, 'iOSNativeAOT')) }}: # Download iOS Mono and CoreCLR (NativeAOT) tests - template: /eng/pipelines/templates/download-artifact-step.yml parameters: @@ -195,6 +197,9 @@ jobs: ${{ if and(eq(parameters.runtimeType, 'iOSMono'), eq(parameters.iOSLlvmBuild, 'True'), eq(parameters.iOSStripSymbols, 'True')) }}: artifactName: 'iOSSampleAppLLVMNoSymbols' artifactFileName: 'iOSSampleAppLLVMNoSymbols.zip' + ${{ if and(eq(parameters.runtimeType, 'iOSCoreCLR'), eq(parameters.codeGenType, 'JIT')) }}: + artifactName: 'iOSCoreCLRSample' + artifactFileName: 'iOSCoreCLRSampleApp.zip' ${{ if and(eq(parameters.runtimeType, 'iOSNativeAOT'), eq(parameters.iOSStripSymbols, 'False')) }}: artifactName: 'iOSSampleAppSymbols' artifactFileName: 'iOSSampleAppSymbols.zip' @@ -217,6 +222,8 @@ jobs: artifactName: 'iOSSampleAppLLVMSymbols' ${{ if and(eq(parameters.runtimeType, 'iOSMono'), eq(parameters.iOSLlvmBuild, 'True'), eq(parameters.iOSStripSymbols, 'True')) }}: artifactName: 'iOSSampleAppLLVMNoSymbols' + ${{ if and(eq(parameters.runtimeType, 'iOSCoreCLR'), eq(parameters.codeGenType, 'JIT')) }}: + artifactName: 'iOSSampleApp' ${{ if and(eq(parameters.runtimeType, 'iOSNativeAOT'), eq(parameters.iOSStripSymbols, 'False')) }}: artifactName: 'iOSSampleAppSymbols' ${{ if and(eq(parameters.runtimeType, 'iOSNativeAOT'), eq(parameters.iOSStripSymbols, 'True')) }}: @@ -236,6 +243,8 @@ jobs: artifactName: 'iOSMonoArm64LLVMNoStripSymbolsBuildLog' ${{ if and(eq(parameters.runtimeType, 'iOSMono'), eq(parameters.iOSLlvmBuild, 'True'), eq(parameters.iOSStripSymbols, 'True')) }}: artifactName: 'iOSMonoArm64LLVMStripSymbolsBuildLog' + ${{ if and(eq(parameters.runtimeType, 'iOSCoreCLR'), eq(parameters.codeGenType, 'JIT')) }}: + artifactName: 'iOSCoreCLRArm64BuildLog' ${{ if and(eq(parameters.runtimeType, 'iOSNativeAOT'), eq(parameters.iOSStripSymbols, 'False')) }}: artifactName: 'iOSNativeAOTArm64NoStripSymbolsBuildLog' ${{ if and(eq(parameters.runtimeType, 'iOSNativeAOT'), eq(parameters.iOSStripSymbols, 'True')) }}: diff --git a/eng/pipelines/upload-build-artifacts-jobs.yml b/eng/pipelines/upload-build-artifacts-jobs.yml index 9ef05e1ff4d..c3b25187063 100644 --- a/eng/pipelines/upload-build-artifacts-jobs.yml +++ b/eng/pipelines/upload-build-artifacts-jobs.yml @@ -147,3 +147,12 @@ jobs: files: [ 'iOSSampleAppSymbols.zip' ] - artifactName: 'iOSSampleAppNoSymbols' files: [ 'iOSSampleAppNoSymbols.zip' ] + + - ${{ if containsValue(parameters.buildType, 'coreclr_arm64_ios') }}: + - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} + parameters: + buildType: 'coreclr_arm64_ios' + dependencyJobName: build_ios_arm64_release_iOSCoreCLR + artifacts: + - artifactName: 'iOSSampleApp' + files: [ 'iOSSampleApp.zip' ] diff --git a/scripts/run_performance_job.py b/scripts/run_performance_job.py index 64d18b14c2f..921d4167ca8 100644 --- a/scripts/run_performance_job.py +++ b/scripts/run_performance_job.py @@ -576,6 +576,7 @@ def run_performance_job(args: RunPerformanceJobArgs): args.libraries_download_dir = os.path.join(args.runtime_repo_dir, "artifacts") ios_mono = args.runtime_type == "iOSMono" + ios_coreclr = args.runtime_type == "iOSCoreCLR" ios_nativeaot = args.runtime_type == "iOSNativeAOT" is_aot = args.codegen_type.lower() == "aot" is_mono = args.runtime_type == "mono" @@ -636,6 +637,8 @@ def run_performance_job(args: RunPerformanceJobArgs): if args.run_kind == "ios_scenarios": if args.runtime_type == "iOSMono": args.runtime_flavor = "mono" + if args.runtime_type == "iOSCoreCLR": + args.runtime_flavor = "coreclr" elif args.runtime_type == "iOSNativeAOT": args.runtime_flavor = "coreclr" else: @@ -841,7 +844,7 @@ def run_performance_job(args: RunPerformanceJobArgs): # shutil.copy(os.path.join(args.built_app_dir, "MonoBenchmarksDroid.apk"), os.path.join(root_payload_dir, "MonoBenchmarksDroid.apk")) ci_setup_arguments.architecture = "arm64" - if ios_mono or ios_nativeaot: + if ios_mono or ios_coreclr or ios_nativeaot: if args.built_app_dir is None: raise Exception("Built apps directory must be present for IOS Mono or IOS Native AOT benchmarks") From cab370439854aa50bac9d6224797c6265be12774 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Thu, 25 Sep 2025 16:48:09 +0200 Subject: [PATCH 2/6] Test build --- eng/pipelines/templates/runtime-perf-job.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/pipelines/templates/runtime-perf-job.yml b/eng/pipelines/templates/runtime-perf-job.yml index bd91d23e4ed..c2c10162bc9 100644 --- a/eng/pipelines/templates/runtime-perf-job.yml +++ b/eng/pipelines/templates/runtime-perf-job.yml @@ -198,8 +198,8 @@ jobs: artifactName: 'iOSSampleAppLLVMNoSymbols' artifactFileName: 'iOSSampleAppLLVMNoSymbols.zip' ${{ if and(eq(parameters.runtimeType, 'iOSCoreCLR'), eq(parameters.codeGenType, 'JIT')) }}: - artifactName: 'iOSCoreCLRSample' - artifactFileName: 'iOSCoreCLRSampleApp.zip' + artifactName: 'iOSSampleApp' + artifactFileName: 'iOSSampleApp.zip' ${{ if and(eq(parameters.runtimeType, 'iOSNativeAOT'), eq(parameters.iOSStripSymbols, 'False')) }}: artifactName: 'iOSSampleAppSymbols' artifactFileName: 'iOSSampleAppSymbols.zip' From c1611fb6198107bf9f7a2a16dfa9d801d54dd41e Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Mon, 29 Sep 2025 10:18:49 +0200 Subject: [PATCH 3/6] Update iOS CoreCLR job to use Interpreter code generation --- eng/pipelines/runtime-ios-scenarios-perf-jobs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/pipelines/runtime-ios-scenarios-perf-jobs.yml b/eng/pipelines/runtime-ios-scenarios-perf-jobs.yml index 67854f4a695..ef7a48e6e9f 100644 --- a/eng/pipelines/runtime-ios-scenarios-perf-jobs.yml +++ b/eng/pipelines/runtime-ios-scenarios-perf-jobs.yml @@ -150,7 +150,7 @@ jobs: - osx_x64 jobParameters: runtimeType: iOSCoreCLR - codeGenType: JIT + codeGenType: Interpreter projectFile: $(Build.SourcesDirectory)/eng/testing/performance/ios_scenarios.proj runKind: ios_scenarios isScenario: true From 2a22cdbd62a9f3dca2bc20fec7a258014ee27713 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Mon, 29 Sep 2025 10:25:54 +0200 Subject: [PATCH 4/6] Update conditions --- eng/pipelines/templates/runtime-perf-job.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/pipelines/templates/runtime-perf-job.yml b/eng/pipelines/templates/runtime-perf-job.yml index c2c10162bc9..12baf40e4ef 100644 --- a/eng/pipelines/templates/runtime-perf-job.yml +++ b/eng/pipelines/templates/runtime-perf-job.yml @@ -197,7 +197,7 @@ jobs: ${{ if and(eq(parameters.runtimeType, 'iOSMono'), eq(parameters.iOSLlvmBuild, 'True'), eq(parameters.iOSStripSymbols, 'True')) }}: artifactName: 'iOSSampleAppLLVMNoSymbols' artifactFileName: 'iOSSampleAppLLVMNoSymbols.zip' - ${{ if and(eq(parameters.runtimeType, 'iOSCoreCLR'), eq(parameters.codeGenType, 'JIT')) }}: + ${{ if and(eq(parameters.runtimeType, 'iOSCoreCLR'), eq(parameters.codeGenType, 'Interpreter')) }}: artifactName: 'iOSSampleApp' artifactFileName: 'iOSSampleApp.zip' ${{ if and(eq(parameters.runtimeType, 'iOSNativeAOT'), eq(parameters.iOSStripSymbols, 'False')) }}: @@ -222,7 +222,7 @@ jobs: artifactName: 'iOSSampleAppLLVMSymbols' ${{ if and(eq(parameters.runtimeType, 'iOSMono'), eq(parameters.iOSLlvmBuild, 'True'), eq(parameters.iOSStripSymbols, 'True')) }}: artifactName: 'iOSSampleAppLLVMNoSymbols' - ${{ if and(eq(parameters.runtimeType, 'iOSCoreCLR'), eq(parameters.codeGenType, 'JIT')) }}: + ${{ if and(eq(parameters.runtimeType, 'iOSCoreCLR'), eq(parameters.codeGenType, 'Interpreter')) }}: artifactName: 'iOSSampleApp' ${{ if and(eq(parameters.runtimeType, 'iOSNativeAOT'), eq(parameters.iOSStripSymbols, 'False')) }}: artifactName: 'iOSSampleAppSymbols' @@ -243,7 +243,7 @@ jobs: artifactName: 'iOSMonoArm64LLVMNoStripSymbolsBuildLog' ${{ if and(eq(parameters.runtimeType, 'iOSMono'), eq(parameters.iOSLlvmBuild, 'True'), eq(parameters.iOSStripSymbols, 'True')) }}: artifactName: 'iOSMonoArm64LLVMStripSymbolsBuildLog' - ${{ if and(eq(parameters.runtimeType, 'iOSCoreCLR'), eq(parameters.codeGenType, 'JIT')) }}: + ${{ if and(eq(parameters.runtimeType, 'iOSCoreCLR'), eq(parameters.codeGenType, 'Interpreter')) }}: artifactName: 'iOSCoreCLRArm64BuildLog' ${{ if and(eq(parameters.runtimeType, 'iOSNativeAOT'), eq(parameters.iOSStripSymbols, 'False')) }}: artifactName: 'iOSNativeAOTArm64NoStripSymbolsBuildLog' From 1c609721a9bff2762977b48e64834683f982c77f Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Mon, 29 Sep 2025 13:44:32 +0200 Subject: [PATCH 5/6] Fix condition branch --- scripts/run_performance_job.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run_performance_job.py b/scripts/run_performance_job.py index 921d4167ca8..2d71ac05d42 100644 --- a/scripts/run_performance_job.py +++ b/scripts/run_performance_job.py @@ -637,7 +637,7 @@ def run_performance_job(args: RunPerformanceJobArgs): if args.run_kind == "ios_scenarios": if args.runtime_type == "iOSMono": args.runtime_flavor = "mono" - if args.runtime_type == "iOSCoreCLR": + elif args.runtime_type == "iOSCoreCLR": args.runtime_flavor = "coreclr" elif args.runtime_type == "iOSNativeAOT": args.runtime_flavor = "coreclr" From b030670b63e7de2752baf0a98b3ef02704fc48f5 Mon Sep 17 00:00:00 2001 From: Milos Kotlar Date: Tue, 30 Sep 2025 10:44:26 +0200 Subject: [PATCH 6/6] Update iOS CoreCLR job dependency to use checked build configuration --- eng/pipelines/templates/runtime-perf-job.yml | 2 +- eng/pipelines/upload-build-artifacts-jobs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/pipelines/templates/runtime-perf-job.yml b/eng/pipelines/templates/runtime-perf-job.yml index 12baf40e4ef..e47df40ea3f 100644 --- a/eng/pipelines/templates/runtime-perf-job.yml +++ b/eng/pipelines/templates/runtime-perf-job.yml @@ -52,7 +52,7 @@ jobs: - ${{ if eq(parameters.runtimeType, 'iOSMono')}}: - ${{ 'build_ios_arm64_release_iOSMono' }} - ${{ if eq(parameters.runtimeType, 'iOSCoreCLR')}}: - - ${{ 'build_ios_arm64_release_iOSCoreCLR' }} + - ${{ 'build_ios_arm64_checked_iOSCoreCLR' }} - ${{ if eq(parameters.runtimeType, 'iOSNativeAOT')}}: - ${{ 'build_ios_arm64_release_iOSNativeAOT' }} diff --git a/eng/pipelines/upload-build-artifacts-jobs.yml b/eng/pipelines/upload-build-artifacts-jobs.yml index c3b25187063..81554da9072 100644 --- a/eng/pipelines/upload-build-artifacts-jobs.yml +++ b/eng/pipelines/upload-build-artifacts-jobs.yml @@ -152,7 +152,7 @@ jobs: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'coreclr_arm64_ios' - dependencyJobName: build_ios_arm64_release_iOSCoreCLR + dependencyJobName: build_ios_arm64_checked_iOSCoreCLR artifacts: - artifactName: 'iOSSampleApp' files: [ 'iOSSampleApp.zip' ]