[LLVMdev] Problem with "Does not dominate all uses"

Rinaldini Julien julien.rinaldini at heig-vd.ch
Mon Aug 20 06:24:30 PDT 2012


Hi!

I'm having some trouble with a pass I'm writing.

I'm using DemotePHIToStack to remove all phi node in my code with this code (this is the first thing I do in my pass):

    // Erase phi node
    vector<PHINode*> phis;
    for (Function::iterator i=f->begin();i!=f->end();++i) {
        for(BasicBlock::iterator b=i->begin();b!=i->end();++b) {
            if(isa<PHINode>(b)) {
                PHINode *phi= cast<PHINode>(b);
                phis.push_back(phi);
            }   
        }   
    }   

    for(vector<PHINode*>::iterator i=phis.begin();i!=phis.end();++i) {
        PHINode *phi = *i; 
        DemotePHIToStack(phi,NULL);
    }

If I only run this code, I obtain this code (see safer.phi.ll).
If I run the rest of my pass, I obtain this code (see safer.phi.obfu.ll)

And I got this error for the file safer.phi.obfu.ll:

Instruction does not dominate all uses!
  %18 = load i8** %key.addr, align 8, !dbg !322
  call void @Safer_Expand_Userkey(i8* %18, i8* %19, i32 %cond.reload, i32 0, i8* %arraydecay), !dbg !322
Instruction does not dominate all uses!
  %19 = load i8** %key.addr, align 8, !dbg !322
  call void @Safer_Expand_Userkey(i8* %18, i8* %19, i32 %cond.reload, i32 0, i8* %arraydecay), !dbg !322
Broken module found, compilation aborted!
0  opt             0x0000000000946d3f
1  opt             0x0000000000947229
2  libpthread.so.0 0x00007fcba9ff2170
3  libc.so.6       0x00007fcba925dfa5 gsignal + 53
4  libc.so.6       0x00007fcba925f428 abort + 328 
5  opt             0x000000000090951d
6  opt             0x00000000008e609f llvm::FPPassManager::runOnFunction(llvm::Function&) + 607 
7  opt             0x00000000008e60f3 llvm::FPPassManager::runOnModule(llvm::Module&) + 51
8  opt             0x00000000008e5c6c llvm::MPPassManager::runOnModule(llvm::Module&) + 524 
9  opt             0x00000000008e5d77 llvm::PassManagerImpl::run(llvm::Module&) + 151 
10 opt             0x00000000004a1d99 main + 3385
11 libc.so.6       0x00007fcba924a725 __libc_start_main + 245 
12 opt             0x00000000004a6135
Stack dump:
0.  Program arguments: opt -load ../../../build/Release+Asserts/lib/LLVMobfuscation.so -flattening src/ciphers/safer/safer.bc -o src/ciphers/safer/safer.bc -stats 
1.  Running pass 'Function Pass Manager' on module 'src/ciphers/safer/safer.bc'.
2.  Running pass 'Module Verifier' on function '@safer_k64_setup'
make: *** [src/ciphers/safer/safer.o] Aborted


So the problem come from the bloc if.end11 and cond.end. I understand the dominate problem, but the thing is that these instruction (in first file):

if.end11:                                         ; preds = %if.end8
  %6 = load i8** %key.addr, align 8, !dbg !322 
  %7 = load i8** %key.addr, align 8, !dbg !322
  ...

cond.end:                                         ; preds = %cond.false, %cond.true
  %cond.reload = load i32* %cond.reg2mem
  %10 = load %union.Symmetric_key** %skey.addr, align 8, !dbg !322
  %safer = bitcast %union.Symmetric_key* %10 to %struct.safer_key*, !dbg !322
  %key13 = getelementptr inbounds %struct.safer_key* %safer, i32 0, i32 0, !dbg !322
  %arraydecay = getelementptr inbounds [217 x i8]* %key13, i32 0, i32 0, !dbg !322
  call void @Safer_Expand_Userkey(i8* %6, i8* %7, i32 %cond.reload, i32 0, i8* %arraydecay), !dbg !322
  store i32 0, i32* %retval, !dbg !323
  br label %return, !dbg !323


are the same in the second file:

if.end11:                                         ; preds = %loopEntry                                                                     
  %18 = load i8** %key.addr, align 8, !dbg !322                                                                                            
  %19 = load i8** %key.addr, align 8, !dbg !322
  ...

cond.end:                                         ; preds = %loopEntry                                                                     
  %cond.reload = load i32* %cond.reg2mem                                                                                                   
  %24 = load %union.Symmetric_key** %skey.addr, align 8, !dbg !322
  %safer = bitcast %union.Symmetric_key* %24 to %struct.safer_key*, !dbg !322                                                              
  %key13 = getelementptr inbounds %struct.safer_key* %safer, i32 0, i32 0, !dbg !322                                                       
  %arraydecay = getelementptr inbounds [217 x i8]* %key13, i32 0, i32 0, !dbg !322                                                         
  call void @Safer_Expand_Userkey(i8* %18, i8* %19, i32 %cond.reload, i32 0, i8* %arraydecay), !dbg !322                                   
  store i32 0, i32* %retval, !dbg !323
  store i32 14, i32* %switchVar
  br label %loopEnd

I don't understant why the first time I don't have a dominate problem, but the second time I do (I'm pretty sure it's because of the rest of my pass but I can't figure where because the code that cause problem it's the same in the both version).

Any idea?

Thx,
Cheers
-------------- next part --------------
A non-text attachment was scrubbed...
Name: safer.phi.ll
Type: application/octet-stream
Size: 4520 bytes
Desc: safer.phi.ll
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120820/0b0984ab/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: safer.phi.obfu.ll
Type: application/octet-stream
Size: 6012 bytes
Desc: safer.phi.obfu.ll
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120820/0b0984ab/attachment-0001.obj>


More information about the llvm-dev mailing list