Passing llvm option -mem2reg to clang


I was trying to pass llvm option -mem2reg to clang using -mllvm and I
found the following error:

clang (LLVM option parsing): Unknown command line argument '-mem2reg'.
Try: 'clang (LLVM option parsing) -help'
clang (LLVM option parsing): Did you mean '-debug'?

I would appreciate if anyone could help me.


You can't schedule passes from the command line using clang, only `opt` has this ability (AFAIK).

If you tell us what is your use-case, we may be able to point you to an alternative solution.

I have my own llvm pass which requires mem2reg. It worked fine with
opt. However, I was trying to make it work with clang as I needed it
to run some spec cpu benchmarks.

Is there any way that I can mention mem2reg (PromotePass) pass as a
pre-requisite in my own pass's implementation?

How are you inserting your pass in the pipeline setup by clang?
You should be able to insert mem2reg before the same way.
Also mem2reg is ran by clang when optimizations are enabled, depending on what your pass is doing it may be a matter of inserting it at the right place.

I have used the following command for my pass (without -mem2reg):

clang -Xclang -load -Xclang -c ../../tests/test1.c

For mem2reg, I tried the following:

clang -mllvm -mem2reg -Xclang -load -Xclang -c ../../tests/test1.c


Is there any way that I can mention mem2reg (PromotePass) pass as a
pre-requisite in my own pass's implementation?

I think you can consider overriding the Pass::getAnalysisUsage(AnalysisUsage &)
method. Described as follows in manual:

In your own pass in method getAnalysisUsage(Analysis &AU), you can add required
pass by:


And get the analysis from the pass:

PassName &P = getAnalysis<PassName>();


Remember to include the necessary header files. This is a way of making sure your
pass always rely on the other passes you want.

BTW I also have a question for the mailing list, is it acceptable to allow an analysis
pass to depend on a transformation pass (like -mem2reg pass)? Is this acceptable so long
as it doesn't cause loop dependencies?


Unless mem2reg does something other than my understanding of it, I can’t see why any pass would “require” that… It is not guaranteed to do anything to any particular piece of code, so relying on it seems very unreliable, I would think.

I tried with -mllvm -mem2reg in different ways to fit mem2reg with
clang. I used the following command:

clang -Xclang -mllvm -mem2reg -Xclang -load -Xclang -c

However, it does not work as it gives the error below:
clang-3.8: error: unknown argument: '-mem2reg'

Then I wrote a pass similar to PmotePass (mem2reg), added it as
dependency pass. It works fine with opt. Then I tried to load my
passes with clang using this command:

clang -Xclang -load -Xclang -c ../../tests/testIfElse.c

It does not throw any error, however, I found that my pass did not
run and I became sure of that as I could not see any debug messages.
Also, the clang command did not create the corresponding binary.

Could any of you please give any hint what I am doing wrong with clang?