|
24 | 24 | #include "llvm/CodeGen/SelectionDAGISel.h"
|
25 | 25 | #include "llvm/IR/Constants.h"
|
26 | 26 | #include "llvm/IR/IntrinsicInst.h"
|
27 |
| -#include "llvm/IR/IntrinsicsBPF.h" |
28 | 27 | #include "llvm/Support/Debug.h"
|
29 | 28 | #include "llvm/Support/Endian.h"
|
30 | 29 | #include "llvm/Support/ErrorHandling.h"
|
@@ -77,7 +76,6 @@ class SBFDAGToDAGISel : public SelectionDAGISel {
|
77 | 76 |
|
78 | 77 | // Node preprocessing cases
|
79 | 78 | void PreprocessLoad(SDNode *Node, SelectionDAG::allnodes_iterator &I);
|
80 |
| - void PreprocessTrunc(SDNode *Node, SelectionDAG::allnodes_iterator &I); |
81 | 79 |
|
82 | 80 | // Find constants from a constant structure
|
83 | 81 | typedef std::vector<unsigned char> val_vec_type;
|
@@ -206,26 +204,6 @@ void SBFDAGToDAGISel::Select(SDNode *Node) {
|
206 | 204 | }
|
207 | 205 | break;
|
208 | 206 | }
|
209 |
| - case ISD::INTRINSIC_W_CHAIN: { |
210 |
| - unsigned IntNo = cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue(); |
211 |
| - switch (IntNo) { |
212 |
| - case Intrinsic::bpf_load_byte: |
213 |
| - case Intrinsic::bpf_load_half: |
214 |
| - case Intrinsic::bpf_load_word: { |
215 |
| - SDLoc DL(Node); |
216 |
| - SDValue Chain = Node->getOperand(0); |
217 |
| - SDValue N1 = Node->getOperand(1); |
218 |
| - SDValue Skb = Node->getOperand(2); |
219 |
| - SDValue N3 = Node->getOperand(3); |
220 |
| - |
221 |
| - SDValue R6Reg = CurDAG->getRegister(SBF::R6, MVT::i64); |
222 |
| - Chain = CurDAG->getCopyToReg(Chain, DL, R6Reg, Skb, SDValue()); |
223 |
| - Node = CurDAG->UpdateNodeOperands(Node, Chain, N1, R6Reg, N3); |
224 |
| - break; |
225 |
| - } |
226 |
| - } |
227 |
| - break; |
228 |
| - } |
229 | 207 |
|
230 | 208 | case ISD::FrameIndex: {
|
231 | 209 | int FI = cast<FrameIndexSDNode>(Node)->getIndex();
|
@@ -377,8 +355,6 @@ void SBFDAGToDAGISel::PreprocessISelDAG() {
|
377 | 355 | unsigned Opcode = Node->getOpcode();
|
378 | 356 | if (Opcode == ISD::LOAD)
|
379 | 357 | PreprocessLoad(Node, I);
|
380 |
| - else if (Opcode == ISD::AND) |
381 |
| - PreprocessTrunc(Node, I); |
382 | 358 | }
|
383 | 359 | }
|
384 | 360 |
|
@@ -508,39 +484,6 @@ bool SBFDAGToDAGISel::fillConstantStruct(const DataLayout &DL,
|
508 | 484 | return true;
|
509 | 485 | }
|
510 | 486 |
|
511 |
| -void SBFDAGToDAGISel::PreprocessTrunc(SDNode *Node, |
512 |
| - SelectionDAG::allnodes_iterator &I) { |
513 |
| - ConstantSDNode *MaskN = dyn_cast<ConstantSDNode>(Node->getOperand(1)); |
514 |
| - if (!MaskN) |
515 |
| - return; |
516 |
| - |
517 |
| - // The Reg operand should be a virtual register, which is defined |
518 |
| - // outside the current basic block. DAG combiner has done a pretty |
519 |
| - // good job in removing truncating inside a single basic block except |
520 |
| - // when the Reg operand comes from bpf_load_[byte | half | word] for |
521 |
| - // which the generic optimizer doesn't understand their results are |
522 |
| - // zero extended. |
523 |
| - SDValue BaseV = Node->getOperand(0); |
524 |
| - if (BaseV.getOpcode() != ISD::INTRINSIC_W_CHAIN) |
525 |
| - return; |
526 |
| - |
527 |
| - unsigned IntNo = cast<ConstantSDNode>(BaseV->getOperand(1))->getZExtValue(); |
528 |
| - uint64_t MaskV = MaskN->getZExtValue(); |
529 |
| - |
530 |
| - if (!((IntNo == Intrinsic::bpf_load_byte && MaskV == 0xFF) || |
531 |
| - (IntNo == Intrinsic::bpf_load_half && MaskV == 0xFFFF) || |
532 |
| - (IntNo == Intrinsic::bpf_load_word && MaskV == 0xFFFFFFFF))) |
533 |
| - return; |
534 |
| - |
535 |
| - LLVM_DEBUG(dbgs() << "Remove the redundant AND operation in: "; |
536 |
| - Node->dump(); dbgs() << '\n'); |
537 |
| - |
538 |
| - I--; |
539 |
| - CurDAG->ReplaceAllUsesWith(SDValue(Node, 0), BaseV); |
540 |
| - I++; |
541 |
| - CurDAG->DeleteNode(Node); |
542 |
| -} |
543 |
| - |
544 | 487 | FunctionPass *llvm::createSBFISelDag(SBFTargetMachine &TM) {
|
545 | 488 | return new SBFDAGToDAGISel(TM);
|
546 | 489 | }
|
0 commit comments