| 833 | } while (0) |
| 834 | |
| 835 | static inline bool verifyFirstUse(IRAccessHelper *IRAH, |
| 836 | RootDefAnalyzer &Analyzer, |
| 837 | std::string FuncName, unsigned BIdx, |
| 838 | unsigned IIdx, unsigned AIdx, |
| 839 | std::set<RDArgIndex> Answers, |
| 840 | bool Debug = false) { |
| 841 | |
| 842 | auto *I = IRAH->getInstruction(FuncName, BIdx, IIdx); |
| 843 | if (!I) { |
| 844 | llvm::outs() << FuncName << " : " << BIdx << " : " << IIdx << "\n"; |
| 845 | RETURN_ERR(false); |
| 846 | } |
| 847 | if (Debug) |
| 848 | llvm::outs() << "Instruction: " << *I << "\n"; |
| 849 | |
| 850 | auto RDs = Analyzer.getRootDefinitions(I->getOperandUse(AIdx)); |
| 851 | if (RDs.size() != 1) { |
| 852 | llvm::outs() << "RD (" << RDs.size() << ")\n"; |
| 853 | for (auto &RD : RDs) |
| 854 | llvm::outs() << RD << "\n"; |
| 855 | RETURN_ERR(false); |
| 856 | } |
| 857 | if (Debug) |
| 858 | llvm::outs() << "Root Definition: " << *RDs.begin() << "\n"; |
| 859 | |
| 860 | auto &FUs = RDs.begin()->getFirstUses(); |
| 861 | if (FUs.size() != Answers.size()) { |
| 862 | llvm::outs() << "Answers ======\n"; |
| 863 | for (auto &Answer : Answers) |
| 864 | llvm::outs() << Answer << "\n"; |
| 865 | |
| 866 | llvm::outs() << "Founds ======\n"; |
| 867 | for (auto &FU : FUs) |
| 868 | llvm::outs() << FU << "\n"; |
| 869 | |
| 870 | RETURN_ERR(false); |
| 871 | } |
| 872 | |
| 873 | for (auto &Answer : Answers) { |
| 874 | if (FUs.find(Answer) != FUs.end()) |
| 875 | continue; |
| 876 | |
| 877 | llvm::outs() << "Answers ======\n"; |
| 878 | for (auto &Answer : Answers) |
| 879 | llvm::outs() << Answer << "\n"; |
| 880 | |
| 881 | llvm::outs() << "Founds ======\n"; |
| 882 | for (auto &FU : FUs) |
| 883 | llvm::outs() << FU << "\n"; |
| 884 | |
| 885 | RETURN_ERR(false); |
| 886 | } |
| 887 | |
| 888 | return true; |
| 889 | } |
| 890 | |
| 891 | TEST_F(TestRootDefAnalyzer, FirstUseP) { |
| 892 |
no test coverage detected