LoopPass doesn't run

I have a hello_world LoopPass:

#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/LoopPass.h"
using namespace llvm;

namespace {
  struct FaulhaberPass : public LoopPass {
    static char ID;
    FaulhaberPass() : LoopPass(ID) {}
    virtual bool runOnLoop(Loop *F, LPPassManager &LPM) {
      errs() << "I saw a loop" << "!\n";
      return false;
    }
  };
}

char FaulhaberPass::ID = 0;

// Automatically enable the pass.
// http://adriansampson.net/blog/clangpass.html
static void registerFaulhaberPass(const PassManagerBuilder &,
                         legacy::PassManagerBase &PM) {
  PM.add(new FaulhaberPass());
}
static RegisterStandardPasses
  RegisterMyPass(PassManagerBuilder::EP_LateLoopOptimizations,
                 registerFaulhaberPass);

and then I build a “.so” out of it and load it:

clang -Xclang -load -Xclang build/faulhaber/libFaulhaberPass.so test.c

It does register the pass, and the constructor is called, but “runOnLoop” is never called. Why?
more info: the procedure is similar to: GitHub - sampsyo/llvm-pass-skeleton: example LLVM pass only changed the pass type to a LoopPass. No issues in compilation/ registering the pass, but it doesn’t run on any loop.