Avoiding Constant Folding

Hi All,

My codegen is trying to generate some thing like this:

entry:
....
  %34 = icmp ne i32 %33, 15
  br i1 %34, label %then, label %else

then: ; preds = %entry
  %returnValue = or i1 true, false
....
  br label %ifmerge

else: ; preds = %entry
  br label %ifmerge

ifmerge: ; preds = %else, %then
...
  %41 = icmp ne i32 %40, 15
  br i1 %41, label %then1, label %else3

then1: ; preds = %ifmerge
  %returnValue2 = or i1 true, %returnValue

else3: ; preds = %ifmerge
  br label %ifmerge4

ifmerge4: ; preds = %else3, %then1
....

And I'm getting the following error:
Instruction does not dominate all uses!
  %returnValue = or i1 true, false
  %returnValue2 = or i1 true, %returnValue
Broken module found, compilation aborted!

From the code I can see all the operands are i1 type, so the 'or'

instructions should be valid. Could some one give me some clues how to fix
this problem?

With Regards,

--Cuong

Maybe take a look at http://llvm.org/docs/tutorial/LangImpl7.html ?
The simplest way to avoid "Instruction does not dominate all uses!"
errors is to avoid having values defined in a different block from the
use.

-Eli

Hi,

entry:
....
  %34 = icmp ne i32 %33, 15
  br i1 %34, label %then, label %else

then: ; preds = %entry
  %returnValue = or i1 true, false
....
  br label %ifmerge

else: ; preds = %entry
  br label %ifmerge

ifmerge: ; preds = %else, %then
...
  %41 = icmp ne i32 %40, 15
  br i1 %41, label %then1, label %else3

then1: ; preds = %ifmerge
  %returnValue2 = or i1 true, %returnValue

if control flow goes: "entry" -> "else" -> "ifmerge" -> "then1", then you will
try to use %returnValue in then1 without ever defining it. This is what the
error message is trying to tell you.

Ciao, Duncan.

else3: ; preds = %ifmerge
  br label %ifmerge4

ifmerge4: ; preds = %else3, %then1
....

And I'm getting the following error:
Instruction does not dominate all uses!
  %returnValue = or i1 true, false
  %returnValue2 = or i1 true, %returnValue
Broken module found, compilation aborted!

Ciao, Duncan.

Thank you guys, now I understand the problem.

I am trying to avoid using stack memory (or mutable variable is the term
used in the tutorial). I am also trying to optimize the code as much as I
can before using optimizer passes such as mem2reg (to reduce the compile
time as well).

With regards,

--Cuong

Duncan Sands wrote:

Hi Cuong,

I am trying to avoid using stack memory (or mutable variable is the term
used in the tutorial). I am also trying to optimize the code as much as I
can before using optimizer passes such as mem2reg (to reduce the compile
time as well).

I don't think there is much point in avoiding stack variables (using them
makes your life much simpler -> easier to have your front-end be correct;
passes like mem2reg will turn your variables into registers if possible
anyway). And there's also not much point in trying to keep the bitcode small
so as to speed up the optimizers: it will just make your front-end more
complicated, while probably the gains (if any) are insignificant. My advice
is to keep your front-end as simple as possible. You can run some per-function
passes as you output each function, to clean it up and reduce the bitcode size,
for example simplifycfg+scalarrepl+instcombine, if memory usage is a problem.

Ciao, Duncan.

Thanks for your explanation and advice. It is very useful for me.

–Cuong

Thank you, Duncan, for your explanation and advice. It is really useful for
me.

--Cuong

Duncan Sands wrote: