generate a weird 'and' instruction

When I use the next code to print all the opcode name in a file xx.o whose source file contains statements “if (diff != 0) klee_assume(diff>0)”, then an opcode name ‘and’ was printed. Where is the ‘and’ instruction from? I checked the file xx.ll of xx.o and I didn’t find a ‘and’ instruction of these two statements.
Besides, when I commented out statement “if (diff != 0)”, the ‘and’ instruction disappeared.

for (llvm::Module::iterator itf = module->begin(); itf != module->end(); ++itf) {
llvm::Function *f = itf;
for (llvm::Function::iterator itb = f->begin(); itb != f->end(); ++itb) {
llvm::BasicBlock *bb = itb;
for (llvm::BasicBlock::iterator iti = bb->begin(); iti != bb->end(); ++iti) {
llvm::Instruction *i = iti;
*msg << i->getOpcodeName() << “\n”;
}
}
}

Perhaps you can provide your example C code and LLVM bitcode.

Regards,
chenwj