Index: clang/lib/CodeGen/BackendUtil.cpp =================================================================== --- clang/lib/CodeGen/BackendUtil.cpp +++ clang/lib/CodeGen/BackendUtil.cpp @@ -74,6 +74,7 @@ #include "llvm/Transforms/ObjCARC.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Scalar/GVN.h" +#include "llvm/Transforms/Scalar/LowerMatrixIntrinsics.h" #include "llvm/Transforms/Utils.h" #include "llvm/Transforms/Utils/CanonicalizeAliases.h" #include "llvm/Transforms/Utils/EntryExitInstrumenter.h" @@ -88,6 +89,8 @@ llvm::PassPluginLibraryInfo get##Ext##PluginInfo(); #include "llvm/Support/Extension.def" +extern cl::opt EnableMatrix; + namespace { // Default filename used for profile generation. @@ -1372,6 +1375,13 @@ } if (CodeGenOpts.OptimizationLevel == 0) { + // FIXME: the backends do not handle matrix intrinsics currently. Make + // sure they are also lowered in O0. A lightweight version of the pass + // should run in the backend pipeline on demand. + if (EnableMatrix) + MPM.addPass( + createModuleToFunctionPassAdaptor(LowerMatrixIntrinsicsPass())); + addCoroutinePassesAtO0(MPM, LangOpts, CodeGenOpts); addSanitizersAtO0(MPM, TargetTriple, LangOpts, CodeGenOpts); } Index: clang/test/CodeGen/matrix-lowering-opt-levels.c =================================================================== --- /dev/null +++ clang/test/CodeGen/matrix-lowering-opt-levels.c @@ -0,0 +1,20 @@ +// RUN: %clang -O0 -fenable-matrix -S -emit-llvm %s -o - | FileCheck %s +// RUN: %clang -O1 -fenable-matrix -S -emit-llvm %s -o - | FileCheck %s +// RUN: %clang -O2 -fenable-matrix -S -emit-llvm %s -o - | FileCheck %s +// RUN: %clang -O3 -fenable-matrix -S -emit-llvm %s -o - | FileCheck %s +// RUN: %clang -Ofast -fenable-matrix -S -emit-llvm %s -o - | FileCheck %s +// RUN: %clang -Os -fenable-matrix -S -emit-llvm %s -o - | FileCheck %s +// RUN: %clang -Oz -fenable-matrix -S -emit-llvm %s -o - | FileCheck %s + +// Smoke test that the matrix intrinsics are lowered at any optimisation level. + +typedef float m4x4_t __attribute__((matrix_type(4, 4))); + +m4x4_t f(m4x4_t a, m4x4_t b, m4x4_t c) { + // + // CHECK-LABEL: f( + // CHECK-NOT: @llvm.matrix + // CHECK: } + // + return a + b * c; +} Index: llvm/lib/Passes/PassBuilder.cpp =================================================================== --- llvm/lib/Passes/PassBuilder.cpp +++ llvm/lib/Passes/PassBuilder.cpp @@ -275,6 +275,8 @@ extern cl::opt AttributorRun; extern cl::opt EnableKnowledgeRetention; +extern cl::opt EnableMatrix; + const PassBuilder::OptimizationLevel PassBuilder::OptimizationLevel::O0 = { /*SpeedLevel*/ 0, /*SizeLevel*/ 0}; @@ -929,6 +931,10 @@ // Create an early function pass manager to cleanup the output of the // frontend. FunctionPassManager EarlyFPM(DebugLogging); + + if (EnableMatrix) + EarlyFPM.addPass(LowerMatrixIntrinsicsPass()); + EarlyFPM.addPass(SimplifyCFGPass()); EarlyFPM.addPass(SROA()); EarlyFPM.addPass(EarlyCSEPass()); Index: llvm/lib/Transforms/IPO/PassManagerBuilder.cpp =================================================================== --- llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +++ llvm/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -149,9 +149,9 @@ "enable-order-file-instrumentation", cl::init(false), cl::Hidden, cl::desc("Enable order file instrumentation (default = off)")); -static cl::opt - EnableMatrix("enable-matrix", cl::init(false), cl::Hidden, - cl::desc("Enable lowering of the matrix intrinsics")); +cl::opt EnableMatrix( + "enable-matrix", cl::init(false), cl::Hidden, + cl::desc("Enable lowering of the matrix intrinsics")); cl::opt AttributorRun( "attributor-enable", cl::Hidden, cl::init(AttributorRunOption::NONE),