projects/p3/C/licm.c
int noSideEffect(LLVMValueRef I) {
    LLVMOpcode opcode = LLVMGetInstructionOpcode(I);
    switch(opcode) {
        // when in doubt, keep it! add opcode here to remove:
        case LLVMFNeg:
        case LLVMAdd:
        case LLVMFAdd:
        case LLVMSub:
        case LLVMFSub:
        case LLVMMul:
        case LLVMFMul:
        case LLVMUDiv:
        case LLVMSDiv:
        case LLVMFDiv:
        case LLVMURem:
        case LLVMSRem:
        case LLVMFRem:
        case LLVMShl:
        case LLVMLShr:
        case LLVMAShr:
        case LLVMAnd:
        case LLVMOr:
        case LLVMXor:
        case LLVMAlloca:
        case LLVMGetElementPtr:
        case LLVMTrunc:
        case LLVMZExt:
        case LLVMSExt:
        case LLVMFPToUI:
        case LLVMFPToSI:
        case LLVMUIToFP:
        case LLVMSIToFP:
        case LLVMFPTrunc:
        case LLVMFPExt:
        case LLVMPtrToInt:
        case LLVMIntToPtr:
        case LLVMBitCast:
        case LLVMAddrSpaceCast:
        case LLVMICmp:
        case LLVMFCmp:
        case LLVMPHI:
        case LLVMSelect:
        case LLVMExtractElement:
        case LLVMInsertElement:
        case LLVMShuffleVector:
        case LLVMExtractValue:
        case LLVMInsertValue:
            // Success!
            return 1;
        case LLVMLoad: 
            if(!LLVMGetVolatile(I)) return 1; // Success
        // all others must be kept
        default:
            break;
    }

    return 0;
}
// check if the instruction has any side effect
check if the instruction has any side effect
check if the instruction has any side effect
int noSideEffect(LLVMValueRef I) {
    LLVMOpcode opcode = LLVMGetInstructionOpcode(I);
    switch(opcode) {
        case LLVMFNeg:
        case LLVMAdd:
        case LLVMFAdd:
        case LLVMSub:
        case LLVMFSub:
        case LLVMMul:
        case LLVMFMul:
        case LLVMUDiv:
        case LLVMSDiv:
        case LLVMFDiv:
        case LLVMURem:
        case LLVMSRem:
        case LLVMFRem:
        case LLVMShl:
        case LLVMLShr:
        case LLVMAShr:
        case LLVMAnd:
        case LLVMOr:
        case LLVMXor:
        case LLVMAlloca:
        case LLVMGetElementPtr:
        case LLVMTrunc:
        case LLVMZExt:
        case LLVMSExt:
        case LLVMFPToUI:
        case LLVMFPToSI:
        case LLVMUIToFP:
        case LLVMSIToFP:
        case LLVMFPTrunc:
        case LLVMFPExt:
        case LLVMPtrToInt:
        case LLVMIntToPtr:
        case LLVMBitCast:
        case LLVMAddrSpaceCast:
        case LLVMICmp:
        case LLVMFCmp:
        case LLVMPHI:
        case LLVMSelect:
        case LLVMExtractElement:
        case LLVMInsertElement:
        case LLVMShuffleVector:
        case LLVMExtractValue:
        case LLVMInsertValue:
            return 1;
        case LLVMLoad: 
            if(!LLVMGetVolatile(I)) return 1; 
        default:
            break;
    }
    return 0;
}
int noSideEffect ( LLVMValueRef I ) { LLVMOpcode opcode = LLVMGetInstructionOpcode ( I ) ; switch ( opcode ) { case LLVMFNeg : case LLVMAdd : case LLVMFAdd : case LLVMSub : case LLVMFSub : case LLVMMul : case LLVMFMul : case LLVMUDiv : case LLVMSDiv : case LLVMFDiv : case LLVMURem : case LLVMSRem : case LLVMFRem : case LLVMShl : case LLVMLShr : case LLVMAShr : case LLVMAnd : case LLVMOr : case LLVMXor : case LLVMAlloca : case LLVMGetElementPtr : case LLVMTrunc : case LLVMZExt : case LLVMSExt : case LLVMFPToUI : case LLVMFPToSI : case LLVMUIToFP : case LLVMSIToFP : case LLVMFPTrunc : case LLVMFPExt : case LLVMPtrToInt : case LLVMIntToPtr : case LLVMBitCast : case LLVMAddrSpaceCast : case LLVMICmp : case LLVMFCmp : case LLVMPHI : case LLVMSelect : case LLVMExtractElement : case LLVMInsertElement : case LLVMShuffleVector : case LLVMExtractValue : case LLVMInsertValue : return 1 ; case LLVMLoad : if ( ! LLVMGetVolatile ( I ) ) return 1 ; default : break ; } return 0 ; }
check if the instruction has any side effect
check if the instruction has any side effect
// when in doubt, keep it! add opcode here to remove: // Success! // Success // all others must be kept