Author: Lukacma Date: 2026-10-07T12:25:51+01:00 New Revision: 21ea23e825432d183ceb43ff74cd1c08a26faf57
URL: https://github.com/llvm/llvm-project/commit/21ea23e825432d183ceb43ff74cd1c08a26faf57 DIFF: https://github.com/llvm/llvm-project/commit/21ea23e825432d183ceb43ff74cd1c08a26faf57.diff LOG: [AArch64][FMV] Skip unreachable versions before emitting feature checks (#229120) Currently there are checks emitted for unreachable features whose results are then ignored. This results in a lot of unnecessary IR being emitted. This patch removes that code, by moving the check for unreachable version to the top of the loop. Added: Modified: clang/lib/CodeGen/CodeGenFunction.cpp clang/test/CodeGen/AArch64/fmv-unreachable-version.c Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 62dade6cf6f49..72a5808cb6229 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -3229,6 +3229,10 @@ void CodeGenFunction::EmitAArch64MultiVersionResolver( llvm::BasicBlock *CurBlock = createBasicBlock("resolver_entry", Resolver); for (const FMVResolverOption &RO : Options) { + // Skip unreachable versions. + if (RO.Function == nullptr) + continue; + Builder.SetInsertPoint(CurBlock); llvm::Value *Condition = FormAArch64ResolverCondition(RO); @@ -3246,10 +3250,6 @@ void CodeGenFunction::EmitAArch64MultiVersionResolver( Builder.SetInsertPoint(CurBlock); } - // Skip unreachable versions. - if (RO.Function == nullptr) - continue; - llvm::BasicBlock *RetBlock = createBasicBlock("resolver_return", Resolver); CGBuilderTy RetBuilder(CGM, RetBlock); CreateMultiVersionResolverReturn(CGM, Resolver, RetBuilder, RO.Function, diff --git a/clang/test/CodeGen/AArch64/fmv-unreachable-version.c b/clang/test/CodeGen/AArch64/fmv-unreachable-version.c index ffb3cb986913f..ca6ce76929713 100644 --- a/clang/test/CodeGen/AArch64/fmv-unreachable-version.c +++ b/clang/test/CodeGen/AArch64/fmv-unreachable-version.c @@ -56,25 +56,13 @@ __attribute__((target_clones("sve2;priority=4", "aes+sve2;priority=3", "lse;prio // CHECK-NEXT: ret ptr @unreachable_versions._Msve // CHECK: resolver_else: // CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 -// CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 69793284352 -// CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 69793284352 +// CHECK-NEXT: [[TMP5:%.*]] = and i64 [[TMP4]], 128 +// CHECK-NEXT: [[TMP6:%.*]] = icmp eq i64 [[TMP5]], 128 // CHECK-NEXT: [[TMP7:%.*]] = and i1 true, [[TMP6]] -// CHECK-NEXT: [[TMP8:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 -// CHECK-NEXT: [[TMP9:%.*]] = and i64 [[TMP8]], 69793317632 -// CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[TMP9]], 69793317632 -// CHECK-NEXT: [[TMP11:%.*]] = and i1 true, [[TMP10]] -// CHECK-NEXT: [[TMP12:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 -// CHECK-NEXT: [[TMP13:%.*]] = and i64 [[TMP12]], 128 -// CHECK-NEXT: [[TMP14:%.*]] = icmp eq i64 [[TMP13]], 128 -// CHECK-NEXT: [[TMP15:%.*]] = and i1 true, [[TMP14]] -// CHECK-NEXT: br i1 [[TMP15]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]] +// CHECK-NEXT: br i1 [[TMP7]], label [[RESOLVER_RETURN1:%.*]], label [[RESOLVER_ELSE2:%.*]] // CHECK: resolver_return1: // CHECK-NEXT: ret ptr @unreachable_versions._Mlse // CHECK: resolver_else2: -// CHECK-NEXT: [[TMP16:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8 -// CHECK-NEXT: [[TMP17:%.*]] = and i64 [[TMP16]], 576460752303423616 -// CHECK-NEXT: [[TMP18:%.*]] = icmp eq i64 [[TMP17]], 576460752303423616 -// CHECK-NEXT: [[TMP19:%.*]] = and i1 true, [[TMP18]] // CHECK-NEXT: ret ptr @unreachable_versions.default // //. _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
