Сравните ИК операнд с константой в LLVM - PullRequest
1 голос
/ 14 февраля 2012

У меня есть IR, который выглядит так:

%5=icmp eq i32 %4,0

Я хочу проверить, равен ли второй операнд инструкции icmp 0 или что-то еще.Я использовал getOperand(1), который возвращает результат в формате Value *.Как я могу сравнить его с константой 0?

1 Ответ

4 голосов
/ 14 февраля 2012

Вот примерный проход, который вы можете запустить, чтобы узнать это:

class DetectZeroValuePass : public FunctionPass {
public:
    static char ID;

    DetectZeroValuePass()
        : FunctionPass(ID)
    {}

    virtual bool runOnFunction(Function &F) {
        for (Function::iterator bb = F.begin(), bb_e = F.end(); bb != bb_e; ++bb) {
            for (BasicBlock::iterator ii = bb->begin(), ii_e = bb->end(); ii != ii_e; ++ii) {
                if (CmpInst *cmpInst = dyn_cast<CmpInst>(&*ii)) {
                    handle_cmp(cmpInst);
                }
            }
        }
    }

    void handle_cmp(CmpInst *cmpInst) {
        // Detect cmp instructions with the second operand being 0
        if (cmpInst->getNumOperands() >= 2) {
            Value *secondOperand = cmpInst->getOperand(1);
            if (ConstantInt *CI = dyn_cast<ConstantInt>(secondOperand))
                if (CI->isZero()) {
                    errs() << "In the following instruction, second operand is 0\n";
                    cmpInst->dump();
                }
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...