{"id":5362,"date":"2025-02-14T15:26:34","date_gmt":"2025-02-14T14:26:34","guid":{"rendered":"https:\/\/www.islandwalking.com\/wordpress\/?p=5362"},"modified":"2025-02-14T15:26:34","modified_gmt":"2025-02-14T14:26:34","slug":"llvm-exercise-vii","status":"publish","type":"post","link":"https:\/\/www.islandwalking.com\/wordpress\/llvm-exercise-vii\/","title":{"rendered":"LLVM Exercise VII"},"content":{"rendered":"<p>So why does the code produced in the last exercise contain the labels <code>.LBB0_2<\/code> and <code>.LBB0_3<\/code> but no <code>.LBB0_1<\/code>?<\/p>\n<p>Well that is because I have added a code generation pass that deletes useless jumps like:<\/p>\n<blockquote>\n<pre>    \tJNC .LBB0_1\r\n    .LBB0_1:\r\n<\/pre>\n<\/blockquote>\n<p>Code snippets:<\/p>\n<blockquote>\n<pre>\r\nvoid HP41MCODEPassConfig::addPreEmitPass() {\r\n    addPass(new RemoveUselessJMP()); }\r\n\r\n...\r\n\r\nbool RemoveUselessJMP::runOnMachineBasicBlock(\r\n    MachineBasicBlock &MBB, MachineBasicBlock &MBBN) {\r\n  bool Modified = false;\r\n\r\n  MachineBasicBlock::iterator I = MBB.end();\r\n  if (I != MBB.begin())\r\n    I--;\r\n  else\r\n    return Modified;\r\n\r\n  if (I->getOpcode() == HP41MCODE::JNC &&\r\n        I->getOperand(0).getMBB() == &MBBN) {\r\n    MBB.erase(I);\r\n    Modified = true;\r\n  }\r\n\r\n  return Modified;\r\n}\r\n\r\nbool RemoveUselessJMP::runOnMachineFunction(MachineFunction &MF) {\r\n  bool Modified = false;\r\n  MachineFunction::iterator FJ = MF.begin();\r\n  if (FJ != MF.end())\r\n    FJ++;\r\n  if (FJ == MF.end())\r\n    return Modified;\r\n  for (MachineFunction::iterator FI = MF.begin(),\r\n       FE = MF.end(); FJ != FE; ++FI, ++FJ)\r\n    Modified |= runOnMachineBasicBlock(*FI, *FJ);\r\n \r\n  return Modified;\r\n}\r\n\r\n<\/pre>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>So why does the code produced in the last exercise contain the labels .LBB0_2 and .LBB0_3 but no .LBB0_1? Well that is because I have added a code generation pass that deletes useless jumps like: JNC .LBB0_1 .LBB0_1: Code snippets: void HP41MCODEPassConfig::addPreEmitPass() { addPass(new RemoveUselessJMP()); } &#8230; bool RemoveUselessJMP::runOnMachineBasicBlock( MachineBasicBlock &#038;MBB, MachineBasicBlock &#038;MBBN) { bool &hellip; <a class=\"read-excerpt\" href=\"https:\/\/www.islandwalking.com\/wordpress\/llvm-exercise-vii\/\">Continue reading <span class=\"meta-nav\">&raquo;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-5362","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/posts\/5362","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/comments?post=5362"}],"version-history":[{"count":5,"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/posts\/5362\/revisions"}],"predecessor-version":[{"id":5367,"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/posts\/5362\/revisions\/5367"}],"wp:attachment":[{"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/media?parent=5362"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/categories?post=5362"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.islandwalking.com\/wordpress\/wp-json\/wp\/v2\/tags?post=5362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}