Index: lib/Target/X86/X86CondBrFolding.cpp =================================================================== --- lib/Target/X86/X86CondBrFolding.cpp +++ lib/Target/X86/X86CondBrFolding.cpp @@ -184,15 +184,25 @@ // Fix up any PHI node in the successor of MBB. static void fixPHIsInSucc(MachineBasicBlock *MBB, MachineBasicBlock *OldMBB, - MachineBasicBlock *NewMBB) { + MachineBasicBlock *NewMBB, bool NewSuccs) { if (NewMBB == OldMBB) return; for (auto MI = MBB->instr_begin(), ME = MBB->instr_end(); MI != ME && MI->isPHI(); ++MI) - for (unsigned i = 2, e = MI->getNumOperands() + 1; i != e; i += 2) { - MachineOperand &MO = MI->getOperand(i); - if (MO.getMBB() == OldMBB) + + for (unsigned i = MI->getNumOperands(); i != 1; i -= 2) { + MachineOperand &MO = MI->getOperand(i - 1); + if (MO.getMBB() != OldMBB) + continue; + // We would like to change incoming edge for this operand from OldMBB to + // NewMBB. If there are already PHIs from MBB to NewMBB, we simply remove + // them. See PR39658. + if (NewSuccs) MO.setMBB(NewMBB); + else { + MI->RemoveOperand(i - 1); + MI->RemoveOperand(i - 2); + } } } @@ -237,10 +247,21 @@ MBBInfo->FBB = NewDest; BrMI = &*UncondBrI; } - fixPHIsInSucc(NewDest, OrigDest, MBB); + + auto SI = + llvm::find_if(MBB->successors(), [&NewDest](const MachineBasicBlock *SI) { + return SI == NewDest; + }); + bool AddNewSuccs = false; + BranchProbability Prob = MBPI->getEdgeProbability(MBB, OrigDest); + if (SI == MBB->succ_end()) { + MBB->addSuccessor(NewDest); + AddNewSuccs = true; + } else + Prob += MBPI->getEdgeProbability(MBB, NewDest); + fixPHIsInSucc(NewDest, OrigDest, MBB, AddNewSuccs); + setBranchProb(MBB, NewDest, Prob); BrMI->eraseFromParent(); - MBB->addSuccessor(NewDest); - setBranchProb(MBB, NewDest, MBPI->getEdgeProbability(MBB, OrigDest)); MBB->removeSuccessor(OrigDest); } @@ -329,8 +350,17 @@ BuildMI(*RootMBB, UncondBrI, RootMBB->findDebugLoc(UncondBrI), TII->get(X86::JMP_1)) .addMBB(TargetMBB); - RootMBB->addSuccessor(TargetMBB); - fixPHIsInSucc(TargetMBB, &MBB, RootMBB); + + auto SI = llvm::find_if( + RootMBB->successors(), + [&TargetMBB](const MachineBasicBlock *SI) { return SI == TargetMBB; }); + bool AddNewSuccs = false; + if (SI == RootMBB->succ_end()) { + RootMBB->addSuccessor(TargetMBB); + AddNewSuccs = true; + } + fixPHIsInSucc(TargetMBB, &MBB, RootMBB, AddNewSuccs); + RootMBB->erase(UncondBrI); } else { replaceBrDest(RootMBB, RootMBBInfo->TBB, TargetMBB); @@ -578,5 +608,10 @@ &getAnalysis(); X86CondBrFolding CondBr(TII, MBPI, MF); - return CondBr.optimize(); + bool Ret = CondBr.optimize(); +#ifdef EXPENSIVE_CHECKS + if (Ret) + MF.verify(); +#endif + return Ret; } Index: test/CodeGen/X86/pr39658.ll =================================================================== --- test/CodeGen/X86/pr39658.ll +++ test/CodeGen/X86/pr39658.ll @@ -0,0 +1,508 @@ +; RUN: llc -mtriple=x86_64-linux-gnu -mcpu=sandybridge %s -o - -verify-machineinstrs + +@global = external global i8 addrspace(1)* +@global.1 = external global i8 addrspace(1)* +@global.2 = external global i64 + +declare void @llvm.experimental.deoptimize.isVoid(...) + +; Function Attrs: uwtable +define void @zot(i8* %arg) #0 gc "statepoint-example" { +bb: + %tmp = alloca i1, align 1 + %tmp1 = getelementptr inbounds i8, i8* %arg, i64 8 + %tmp2 = bitcast i8* %tmp1 to i32* + %tmp3 = load i32, i32* %tmp2, align 4 + %tmp4 = getelementptr inbounds i8, i8* %arg, i64 16 + %tmp5 = bitcast i8* %tmp4 to i32* + %tmp6 = load i32, i32* %tmp5, align 4 + %tmp7 = getelementptr inbounds i8, i8* %arg, i64 32 + %tmp8 = bitcast i8* %tmp7 to i32* + %tmp9 = load i32, i32* %tmp8, align 4 + %tmp10 = getelementptr inbounds i8, i8* %arg, i64 40 + %tmp11 = bitcast i8* %tmp10 to i32* + %tmp12 = load i32, i32* %tmp11, align 4 + store volatile i1 true, i1* %tmp, align 1 + %tmp13 = load volatile i1, i1* %tmp, align 1 + br i1 %tmp13, label %bb14, label %bb223 + +bb14: ; preds = %bb + %tmp15 = mul i32 %tmp3, 24 + %tmp16 = mul i32 %tmp3, 576 + %tmp17 = mul i32 %tmp3, 13824 + %tmp18 = add i32 %tmp9, 1 + %tmp19 = icmp sgt i32 %tmp18, 192 + %tmp20 = select i1 %tmp19, i32 %tmp18, i32 192 + %tmp21 = sub i32 %tmp20, %tmp9 + %tmp22 = xor i32 %tmp9, -1 + %tmp23 = add i32 %tmp20, %tmp22 + %tmp24 = and i32 %tmp21, 3 + %tmp25 = icmp eq i32 %tmp24, 0 + br i1 %tmp25, label %bb99, label %bb26 + +bb26: ; preds = %bb14 + %tmp27 = load i8 addrspace(1)*, i8 addrspace(1)** @global.1, align 8 + %tmp28 = icmp eq i8 addrspace(1)* %tmp27, null + %tmp29 = ptrtoint i8 addrspace(1)* %tmp27 to i64, !verifier_exception !0 + %tmp30 = xor i64 %tmp29, -1 + %tmp31 = inttoptr i64 %tmp30 to i8 addrspace(1)*, !verifier_exception !0 + %tmp32 = select i1 %tmp28, i8 addrspace(1)* null, i8 addrspace(1)* %tmp31 + %tmp33 = load i64, i64* @global.2, align 8 + %tmp34 = ptrtoint i8 addrspace(1)* %tmp32 to i64, !verifier_exception !0 + %tmp35 = and i64 %tmp33, %tmp34 + %tmp36 = icmp eq i64 %tmp35, 0 + br i1 %tmp36, label %bb39, label %bb37, !prof !1 + +bb37: ; preds = %bb26 + %tmp38 = call i8 addrspace(1)* @baz(i8 addrspace(1)* %tmp32, i8 addrspace(1)** nonnull @global.1) #5 + br label %bb39 + +bb39: ; preds = %bb37, %bb26 + %tmp40 = phi i8 addrspace(1)* [ %tmp38, %bb37 ], [ %tmp32, %bb26 ] + %tmp41 = getelementptr inbounds i8, i8 addrspace(1)* %tmp40, i64 800 + %tmp42 = bitcast i8 addrspace(1)* %tmp41 to i64 addrspace(1)* + br label %bb43 + +bb43: ; preds = %bb93, %bb39 + %tmp44 = phi i64 addrspace(1)* [ %tmp42, %bb39 ], [ %tmp58, %bb93 ] + %tmp45 = phi i8 addrspace(1)* [ %tmp40, %bb39 ], [ %tmp59, %bb93 ] + %tmp46 = phi i32 [ %tmp6, %bb39 ], [ %tmp94, %bb93 ] + %tmp47 = phi i32 [ %tmp9, %bb39 ], [ %tmp96, %bb93 ] + %tmp48 = phi i32 [ %tmp12, %bb39 ], [ 1, %bb93 ] + %tmp49 = phi i32 [ %tmp24, %bb39 ], [ %tmp97, %bb93 ] + %tmp50 = load volatile i32, i32 addrspace(256)* inttoptr (i64 104 to i32 addrspace(256)*), align 8 + %tmp51 = icmp eq i32 %tmp50, 0 + br i1 %tmp51, label %bb57, label %bb52, !prof !1 + +bb52: ; preds = %bb43 + %tmp53 = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* nonnull @wobble, i32 0, i32 0, i32 0, i32 19, i32 0, i32 1, i32 0, i32 28, i32 0, i32 6, i32 0, i32 7, i8* null, i32 3, i32 %tmp3, i32 3, i32 %tmp46, i32 7, i8* null, i32 3, i32 %tmp47, i32 3, i32 %tmp48, i8 addrspace(1)* %tmp45) #6 + %tmp54 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp53, i32 26, i32 26) ; (%tmp45, %tmp45) + %tmp55 = getelementptr inbounds i8, i8 addrspace(1)* %tmp54, i64 800 + %tmp56 = bitcast i8 addrspace(1)* %tmp55 to i64 addrspace(1)* + br label %bb57 + +bb57: ; preds = %bb52, %bb43 + %tmp58 = phi i64 addrspace(1)* [ %tmp44, %bb43 ], [ %tmp56, %bb52 ] + %tmp59 = phi i8 addrspace(1)* [ %tmp45, %bb43 ], [ %tmp54, %bb52 ] + %tmp60 = icmp sgt i32 %tmp48, 1 + br i1 %tmp60, label %bb76, label %bb61, !prof !2 + +bb61: ; preds = %bb57 + %tmp62 = load i64, i64 addrspace(1)* %tmp58, align 8 + %tmp63 = or i32 %tmp48, %tmp46 + %tmp64 = sext i32 %tmp63 to i64 + %tmp65 = add i64 %tmp62, %tmp64 + store i64 %tmp65, i64 addrspace(1)* %tmp58, align 8 + %tmp66 = icmp eq i32 %tmp48, 1 + br i1 %tmp66, label %bb76, label %bb67, !prof !3 + +bb67: ; preds = %bb67, %bb61 + %tmp68 = phi i64 [ %tmp73, %bb67 ], [ %tmp65, %bb61 ] + %tmp69 = phi i32 [ %tmp70, %bb67 ], [ %tmp48, %bb61 ] + %tmp70 = add nsw i32 %tmp69, 1 + %tmp71 = or i32 %tmp70, %tmp46 + %tmp72 = sext i32 %tmp71 to i64 + %tmp73 = add i64 %tmp68, %tmp72 + %tmp74 = icmp sgt i32 %tmp69, -1 + br i1 %tmp74, label %bb75, label %bb67, !prof !2, !llvm.loop !4 + +bb75: ; preds = %bb67 + store i64 %tmp73, i64 addrspace(1)* %tmp58, align 8 + br label %bb76 + +bb76: ; preds = %bb75, %bb61, %bb57 + %tmp77 = icmp sgt i32 %tmp47, 43 + br i1 %tmp77, label %bb93, label %bb78, !prof !6 + +bb78: ; preds = %bb76 + %tmp79 = icmp eq i32 %tmp47, 43 + br i1 %tmp79, label %bb90, label %bb80, !prof !3 + +bb80: ; preds = %bb78 + %tmp81 = icmp slt i32 %tmp47, 42 + br i1 %tmp81, label %bb82, label %bb90, !prof !7 + +bb82: ; preds = %bb80 + %tmp83 = icmp eq i32 %tmp47, 41 + br i1 %tmp83, label %bb90, label %bb84, !prof !6 + +bb84: ; preds = %bb84, %bb82 + %tmp85 = phi i32 [ %tmp87, %bb84 ], [ %tmp17, %bb82 ] + %tmp86 = phi i32 [ %tmp88, %bb84 ], [ 41, %bb82 ] + %tmp87 = mul i32 %tmp85, 24 + %tmp88 = add nsw i32 %tmp86, -1 + %tmp89 = icmp sgt i32 %tmp88, %tmp47 + br i1 %tmp89, label %bb84, label %bb90, !prof !7, !llvm.loop !8 + +bb90: ; preds = %bb84, %bb82, %bb80, %bb78 + %tmp91 = phi i32 [ %tmp15, %bb78 ], [ %tmp16, %bb80 ], [ %tmp17, %bb82 ], [ %tmp87, %bb84 ] + %tmp92 = sext i32 %tmp47 to i64 + br label %bb93 + +bb93: ; preds = %bb90, %bb76 + %tmp94 = phi i32 [ %tmp3, %bb76 ], [ %tmp91, %bb90 ] + %tmp95 = phi i64 [ 44, %bb76 ], [ %tmp92, %bb90 ] + %tmp96 = add i32 %tmp47, 1 + %tmp97 = add nsw i32 %tmp49, -1 + %tmp98 = icmp eq i32 %tmp97, 0 + br i1 %tmp98, label %bb99, label %bb43, !llvm.loop !9 + +bb99: ; preds = %bb93, %bb14 + %tmp100 = phi i64 [ undef, %bb14 ], [ %tmp95, %bb93 ] + %tmp101 = phi i32 [ %tmp6, %bb14 ], [ %tmp94, %bb93 ] + %tmp102 = phi i32 [ %tmp9, %bb14 ], [ %tmp96, %bb93 ] + %tmp103 = phi i32 [ %tmp12, %bb14 ], [ 1, %bb93 ] + %tmp104 = icmp ult i32 %tmp23, 3 + br i1 %tmp104, label %bb166, label %bb105 + +bb105: ; preds = %bb99 + %tmp106 = load i8 addrspace(1)*, i8 addrspace(1)** @global.1, align 8 + %tmp107 = icmp eq i8 addrspace(1)* %tmp106, null + %tmp108 = ptrtoint i8 addrspace(1)* %tmp106 to i64, !verifier_exception !0 + %tmp109 = xor i64 %tmp108, -1 + %tmp110 = inttoptr i64 %tmp109 to i8 addrspace(1)*, !verifier_exception !0 + %tmp111 = select i1 %tmp107, i8 addrspace(1)* null, i8 addrspace(1)* %tmp110 + %tmp112 = load i64, i64* @global.2, align 8 + %tmp113 = ptrtoint i8 addrspace(1)* %tmp111 to i64, !verifier_exception !0 + %tmp114 = and i64 %tmp112, %tmp113 + %tmp115 = icmp eq i64 %tmp114, 0 + br i1 %tmp115, label %bb118, label %bb116, !prof !1 + +bb116: ; preds = %bb105 + %tmp117 = call i8 addrspace(1)* @baz(i8 addrspace(1)* %tmp111, i8 addrspace(1)** nonnull @global.1) #5 + br label %bb118 + +bb118: ; preds = %bb116, %bb105 + %tmp119 = phi i8 addrspace(1)* [ %tmp117, %bb116 ], [ %tmp111, %bb105 ] + %tmp120 = getelementptr inbounds i8, i8 addrspace(1)* %tmp119, i64 800 + %tmp121 = bitcast i8 addrspace(1)* %tmp120 to i64 addrspace(1)* + %tmp122 = or i32 %tmp15, 1 + %tmp123 = sext i32 %tmp122 to i64 + %tmp124 = or i32 %tmp3, 1 + %tmp125 = sext i32 %tmp124 to i64 + br label %bb126 + +bb126: ; preds = %bb302, %bb118 + %tmp127 = phi i64 addrspace(1)* [ %tmp121, %bb118 ], [ %tmp140, %bb302 ] + %tmp128 = phi i8 addrspace(1)* [ %tmp119, %bb118 ], [ %tmp141, %bb302 ] + %tmp129 = phi i32 [ %tmp101, %bb118 ], [ %tmp303, %bb302 ] + %tmp130 = phi i32 [ %tmp102, %bb118 ], [ %tmp305, %bb302 ] + %tmp131 = phi i32 [ %tmp103, %bb118 ], [ 1, %bb302 ] + %tmp132 = load volatile i32, i32 addrspace(256)* inttoptr (i64 104 to i32 addrspace(256)*), align 8 + %tmp133 = icmp eq i32 %tmp132, 0 + br i1 %tmp133, label %bb139, label %bb134, !prof !1 + +bb134: ; preds = %bb126 + %tmp135 = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* nonnull @wobble, i32 0, i32 0, i32 0, i32 19, i32 0, i32 1, i32 0, i32 28, i32 0, i32 6, i32 0, i32 7, i8* null, i32 3, i32 %tmp3, i32 3, i32 %tmp129, i32 7, i8* null, i32 3, i32 %tmp130, i32 3, i32 %tmp131, i8 addrspace(1)* %tmp128) #6 + %tmp136 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp135, i32 26, i32 26) ; (%tmp128, %tmp128) + %tmp137 = getelementptr inbounds i8, i8 addrspace(1)* %tmp136, i64 800 + %tmp138 = bitcast i8 addrspace(1)* %tmp137 to i64 addrspace(1)* + br label %bb139 + +bb139: ; preds = %bb134, %bb126 + %tmp140 = phi i64 addrspace(1)* [ %tmp127, %bb126 ], [ %tmp138, %bb134 ] + %tmp141 = phi i8 addrspace(1)* [ %tmp128, %bb126 ], [ %tmp136, %bb134 ] + %tmp142 = icmp sgt i32 %tmp131, 1 + br i1 %tmp142, label %bb150, label %bb143, !prof !2 + +bb143: ; preds = %bb139 + %tmp144 = load i64, i64 addrspace(1)* %tmp140, align 8 + %tmp145 = or i32 %tmp131, %tmp129 + %tmp146 = sext i32 %tmp145 to i64 + %tmp147 = add i64 %tmp144, %tmp146 + store i64 %tmp147, i64 addrspace(1)* %tmp140, align 8 + %tmp148 = icmp eq i32 %tmp131, 1 + br i1 %tmp148, label %bb150, label %bb215, !prof !3 + +bb149: ; preds = %bb215 + store i64 %tmp221, i64 addrspace(1)* %tmp140, align 8 + br label %bb150 + +bb150: ; preds = %bb149, %bb143, %bb139 + %tmp151 = icmp sgt i32 %tmp130, 43 + br i1 %tmp151, label %bb158, label %bb152, !prof !6 + +bb152: ; preds = %bb150 + %tmp153 = icmp eq i32 %tmp130, 43 + br i1 %tmp153, label %bb158, label %bb154, !prof !3 + +bb154: ; preds = %bb152 + %tmp155 = icmp slt i32 %tmp130, 42 + br i1 %tmp155, label %bb156, label %bb158, !prof !7 + +bb156: ; preds = %bb154 + %tmp157 = icmp eq i32 %tmp130, 41 + br i1 %tmp157, label %bb158, label %bb209, !prof !6 + +bb158: ; preds = %bb209, %bb156, %bb154, %bb152, %bb150 + %tmp159 = phi i32 [ %tmp3, %bb150 ], [ %tmp15, %bb152 ], [ %tmp16, %bb154 ], [ %tmp17, %bb156 ], [ %tmp212, %bb209 ] + %tmp160 = add i32 %tmp130, 1 + %tmp161 = load i64, i64 addrspace(1)* %tmp140, align 8 + %tmp162 = or i32 %tmp159, 1 + %tmp163 = sext i32 %tmp162 to i64 + %tmp164 = add i64 %tmp161, %tmp163 + store i64 %tmp164, i64 addrspace(1)* %tmp140, align 8 + %tmp165 = icmp sgt i32 %tmp160, 43 + br i1 %tmp165, label %bb251, label %bb227, !prof !6 + +bb166: ; preds = %bb302, %bb99 + %tmp167 = phi i64 [ %tmp100, %bb99 ], [ %tmp304, %bb302 ] + %tmp168 = load i64, i64* bitcast (i8 addrspace(1)** @global to i64*), align 8 + %tmp169 = xor i64 %tmp168, -1 + %tmp170 = inttoptr i64 %tmp169 to i8 addrspace(1)*, !verifier_exception !0 + %tmp171 = load i64, i64* @global.2, align 8 + %tmp172 = and i64 %tmp171, %tmp169 + %tmp173 = icmp eq i64 %tmp172, 0 + br i1 %tmp173, label %bb176, label %bb174, !prof !1 + +bb174: ; preds = %bb166 + %tmp175 = call i8 addrspace(1)* @baz(i8 addrspace(1)* %tmp170, i8 addrspace(1)** nonnull @global) #5 + br label %bb176 + +bb176: ; preds = %bb174, %bb166 + %tmp177 = phi i8 addrspace(1)* [ %tmp175, %bb174 ], [ %tmp170, %bb166 ] + %tmp178 = getelementptr inbounds i8, i8 addrspace(1)* %tmp177, i64 792 + %tmp179 = bitcast i8 addrspace(1)* %tmp178 to i8 addrspace(1)* addrspace(1)* + %tmp180 = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(1)* %tmp179, align 8 + %tmp181 = icmp eq i8 addrspace(1)* %tmp180, null + %tmp182 = ptrtoint i8 addrspace(1)* %tmp180 to i64, !verifier_exception !0 + %tmp183 = xor i64 %tmp182, -1 + %tmp184 = inttoptr i64 %tmp183 to i8 addrspace(1)*, !verifier_exception !0 + %tmp185 = select i1 %tmp181, i8 addrspace(1)* null, i8 addrspace(1)* %tmp184 + %tmp186 = ptrtoint i8 addrspace(1)* %tmp185 to i64, !verifier_exception !0 + %tmp187 = and i64 %tmp171, %tmp186 + %tmp188 = icmp eq i64 %tmp187, 0 + br i1 %tmp188, label %bb191, label %bb189, !prof !1 + +bb189: ; preds = %bb176 + %tmp190 = call i8 addrspace(1)* @pluto(i8 addrspace(1)* %tmp185, i8 addrspace(1)* addrspace(1)* %tmp179) #5 + br label %bb191 + +bb191: ; preds = %bb189, %bb176 + %tmp192 = phi i8 addrspace(1)* [ %tmp190, %bb189 ], [ %tmp185, %bb176 ] + %tmp193 = icmp eq i8 addrspace(1)* %tmp192, null + br i1 %tmp193, label %bb225, label %bb194, !prof !10, !make.implicit !11 + +bb194: ; preds = %bb191 + %tmp195 = load i64, i64* bitcast (i8 addrspace(1)** @global.1 to i64*), align 8 + %tmp196 = xor i64 %tmp195, -1 + %tmp197 = inttoptr i64 %tmp196 to i8 addrspace(1)*, !verifier_exception !0 + %tmp198 = and i64 %tmp171, %tmp196 + %tmp199 = icmp eq i64 %tmp198, 0 + br i1 %tmp199, label %bb202, label %bb200, !prof !1 + +bb200: ; preds = %bb194 + %tmp201 = call i8 addrspace(1)* @baz(i8 addrspace(1)* %tmp197, i8 addrspace(1)** nonnull @global.1) #5 + br label %bb202 + +bb202: ; preds = %bb200, %bb194 + %tmp203 = phi i8 addrspace(1)* [ %tmp201, %bb200 ], [ %tmp197, %bb194 ] + %tmp204 = getelementptr inbounds i8, i8 addrspace(1)* %tmp203, i64 800 + %tmp205 = bitcast i8 addrspace(1)* %tmp204 to i64 addrspace(1)* + %tmp206 = load i64, i64 addrspace(1)* %tmp205, align 8 + %tmp207 = add i64 %tmp206, %tmp167 + %tmp208 = call token (i64, i32, void (i8 addrspace(1)*, i64)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i8i64f(i64 2, i32 5, void (i8 addrspace(1)*, i64)* nonnull @blam, i32 2, i32 0, i8 addrspace(1)* nonnull %tmp192, i64 %tmp207, i32 0, i32 19, i32 0, i32 2, i32 0, i32 94, i32 0, i32 6, i32 0, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i8 addrspace(1)* nonnull %tmp192) #7 + ret void + +bb209: ; preds = %bb209, %bb156 + %tmp210 = phi i32 [ %tmp212, %bb209 ], [ %tmp17, %bb156 ] + %tmp211 = phi i32 [ %tmp213, %bb209 ], [ 41, %bb156 ] + %tmp212 = mul i32 %tmp210, 24 + %tmp213 = add nsw i32 %tmp211, -1 + %tmp214 = icmp sgt i32 %tmp213, %tmp130 + br i1 %tmp214, label %bb209, label %bb158, !prof !7, !llvm.loop !8 + +bb215: ; preds = %bb215, %bb143 + %tmp216 = phi i64 [ %tmp221, %bb215 ], [ %tmp147, %bb143 ] + %tmp217 = phi i32 [ %tmp218, %bb215 ], [ %tmp131, %bb143 ] + %tmp218 = add nsw i32 %tmp217, 1 + %tmp219 = or i32 %tmp218, %tmp129 + %tmp220 = sext i32 %tmp219 to i64 + %tmp221 = add i64 %tmp216, %tmp220 + %tmp222 = icmp sgt i32 %tmp217, -1 + br i1 %tmp222, label %bb149, label %bb215, !prof !2, !llvm.loop !4 + +bb223: ; preds = %bb + %tmp224 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @widget, i32 1, i32 0, i32 0, i32 0, i32 19, i32 0, i32 1, i32 0, i32 28, i32 0, i32 6, i32 0, i32 7, i8* null, i32 3, i32 %tmp3, i32 3, i32 %tmp6, i32 7, i8* null, i32 3, i32 %tmp9, i32 3, i32 %tmp12) + unreachable + +bb225: ; preds = %bb191 + %tmp226 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @widget, i32 1, i32 0, i32 8, i32 0, i32 25, i32 0, i32 1, i32 0, i32 94, i32 3, i32 6, i32 0, i32 0, i8 addrspace(1)* null, i32 7, i64 undef, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null) + unreachable + +bb227: ; preds = %bb158 + %tmp228 = icmp eq i32 %tmp160, 43 + br i1 %tmp228, label %bb229, label %bb232, !prof !3 + +bb229: ; preds = %bb227 + %tmp230 = add i64 %tmp164, %tmp123 + %tmp231 = add i64 %tmp230, %tmp125 + store i64 %tmp231, i64 addrspace(1)* %tmp140, align 8 + br label %bb302 + +bb232: ; preds = %bb227 + %tmp233 = icmp slt i32 %tmp160, 42 + br i1 %tmp233, label %bb234, label %bb242, !prof !7 + +bb234: ; preds = %bb232 + %tmp235 = icmp eq i32 %tmp160, 41 + br i1 %tmp235, label %bb242, label %bb236, !prof !6 + +bb236: ; preds = %bb236, %bb234 + %tmp237 = phi i32 [ %tmp239, %bb236 ], [ %tmp17, %bb234 ] + %tmp238 = phi i32 [ %tmp240, %bb236 ], [ 41, %bb234 ] + %tmp239 = mul i32 %tmp237, 24 + %tmp240 = add nsw i32 %tmp238, -1 + %tmp241 = icmp sgt i32 %tmp240, %tmp160 + br i1 %tmp241, label %bb236, label %bb248, !prof !7, !llvm.loop !8 + +bb242: ; preds = %bb234, %bb232 + %tmp243 = phi i32 [ %tmp17, %bb234 ], [ %tmp16, %bb232 ] + %tmp244 = add nuw nsw i32 %tmp130, 2 + %tmp245 = or i32 %tmp243, 1 + %tmp246 = sext i32 %tmp245 to i64 + %tmp247 = add i64 %tmp164, %tmp246 + store i64 %tmp247, i64 addrspace(1)* %tmp140, align 8 + br label %bb256 + +bb248: ; preds = %bb236 + %tmp249 = or i32 %tmp239, 1 + %tmp250 = sext i32 %tmp249 to i64 + br label %bb251 + +bb251: ; preds = %bb248, %bb158 + %tmp252 = phi i64 [ %tmp250, %bb248 ], [ %tmp125, %bb158 ] + %tmp253 = add i32 %tmp130, 2 + %tmp254 = add i64 %tmp164, %tmp252 + store i64 %tmp254, i64 addrspace(1)* %tmp140, align 8 + %tmp255 = icmp sgt i32 %tmp253, 43 + br i1 %tmp255, label %bb279, label %bb256, !prof !6 + +bb256: ; preds = %bb251, %bb242 + %tmp257 = phi i64 [ %tmp247, %bb242 ], [ %tmp254, %bb251 ] + %tmp258 = phi i32 [ %tmp244, %bb242 ], [ %tmp253, %bb251 ] + %tmp259 = icmp eq i32 %tmp258, 43 + br i1 %tmp259, label %bb279, label %bb260, !prof !3 + +bb260: ; preds = %bb256 + %tmp261 = icmp slt i32 %tmp258, 42 + br i1 %tmp261, label %bb262, label %bb270, !prof !7 + +bb262: ; preds = %bb260 + %tmp263 = icmp eq i32 %tmp258, 41 + br i1 %tmp263, label %bb270, label %bb264, !prof !6 + +bb264: ; preds = %bb264, %bb262 + %tmp265 = phi i32 [ %tmp267, %bb264 ], [ %tmp17, %bb262 ] + %tmp266 = phi i32 [ %tmp268, %bb264 ], [ 41, %bb262 ] + %tmp267 = mul i32 %tmp265, 24 + %tmp268 = add nsw i32 %tmp266, -1 + %tmp269 = icmp sgt i32 %tmp268, %tmp258 + br i1 %tmp269, label %bb264, label %bb276, !prof !7, !llvm.loop !8 + +bb270: ; preds = %bb262, %bb260 + %tmp271 = phi i32 [ %tmp17, %bb262 ], [ %tmp16, %bb260 ] + %tmp272 = add i32 %tmp130, 3 + %tmp273 = or i32 %tmp271, 1 + %tmp274 = sext i32 %tmp273 to i64 + %tmp275 = add i64 %tmp257, %tmp274 + store i64 %tmp275, i64 addrspace(1)* %tmp140, align 8 + br label %bb285 + +bb276: ; preds = %bb264 + %tmp277 = or i32 %tmp267, 1 + %tmp278 = sext i32 %tmp277 to i64 + br label %bb279 + +bb279: ; preds = %bb276, %bb256, %bb251 + %tmp280 = phi i64 [ %tmp278, %bb276 ], [ %tmp123, %bb256 ], [ %tmp125, %bb251 ] + %tmp281 = phi i64 [ %tmp257, %bb276 ], [ %tmp257, %bb256 ], [ %tmp254, %bb251 ] + %tmp282 = add i32 %tmp130, 3 + %tmp283 = add i64 %tmp281, %tmp280 + store i64 %tmp283, i64 addrspace(1)* %tmp140, align 8 + %tmp284 = icmp sgt i32 %tmp282, 43 + br i1 %tmp284, label %bb302, label %bb285, !prof !6 + +bb285: ; preds = %bb279, %bb270 + %tmp286 = phi i32 [ %tmp272, %bb270 ], [ %tmp282, %bb279 ] + %tmp287 = icmp eq i32 %tmp286, 43 + br i1 %tmp287, label %bb298, label %bb288, !prof !3 + +bb288: ; preds = %bb285 + %tmp289 = icmp slt i32 %tmp286, 42 + br i1 %tmp289, label %bb290, label %bb298, !prof !7 + +bb290: ; preds = %bb288 + %tmp291 = icmp eq i32 %tmp286, 41 + br i1 %tmp291, label %bb298, label %bb292, !prof !6 + +bb292: ; preds = %bb292, %bb290 + %tmp293 = phi i32 [ %tmp295, %bb292 ], [ %tmp17, %bb290 ] + %tmp294 = phi i32 [ %tmp296, %bb292 ], [ 41, %bb290 ] + %tmp295 = mul i32 %tmp293, 24 + %tmp296 = add nsw i32 %tmp294, -1 + %tmp297 = icmp sgt i32 %tmp296, %tmp286 + br i1 %tmp297, label %bb292, label %bb298, !prof !7, !llvm.loop !8 + +bb298: ; preds = %bb292, %bb290, %bb288, %bb285 + %tmp299 = phi i32 [ 43, %bb285 ], [ 42, %bb288 ], [ 41, %bb290 ], [ %tmp286, %bb292 ] + %tmp300 = phi i32 [ %tmp15, %bb285 ], [ %tmp16, %bb288 ], [ %tmp17, %bb290 ], [ %tmp295, %bb292 ] + %tmp301 = sext i32 %tmp299 to i64 + br label %bb302 + +bb302: ; preds = %bb298, %bb279, %bb229 + %tmp303 = phi i32 [ %tmp3, %bb279 ], [ %tmp300, %bb298 ], [ %tmp3, %bb229 ] + %tmp304 = phi i64 [ 44, %bb279 ], [ %tmp301, %bb298 ], [ 44, %bb229 ] + %tmp305 = add i32 %tmp130, 4 + %tmp306 = icmp sgt i32 %tmp305, 191 + br i1 %tmp306, label %bb166, label %bb126, !prof !12 +} + +; Function Attrs: nounwind +declare void @wobble() #1 + +; Function Attrs: noinline +declare void @blam(i8 addrspace(1)*, i64) #2 + +declare void @wibble(...) + +declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...) + +; Function Attrs: nounwind readonly +declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32, i32) #3 + +declare token @llvm.experimental.gc.statepoint.p0f_isVoidp1i8i64f(i64, i32, void (i8 addrspace(1)*, i64)*, i32, i32, ...) + +declare void @widget(i32) + +declare token @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64, i32, void (i32)*, i32, i32, ...) + +; Function Attrs: argmemonly nounwind +declare i8 addrspace(1)* @baz(i8 addrspace(1)*, i8 addrspace(1)**) #4 + +; Function Attrs: argmemonly nounwind +declare i8 addrspace(1)* @pluto(i8 addrspace(1)*, i8 addrspace(1)* addrspace(1)*) #4 + +attributes #0 = { uwtable "disable-tail-calls"="true" "gc-add-backedge-safepoints"="true" "gc-add-call-safepoints"="true" "gc-add-entry-safepoints"="true" "no-entry-safepoint-poll" "patchable-function"="prologue-short-redirect" "target-cpu"="broadwell" "target-features"="+sse2,+cx16,+sahf,-tbm,-avx512ifma,-sha,-gfni,-fma4,-vpclmulqdq,+prfchw,+bmi2,-cldemote,+fsgsbase,-ptwrite,-xsavec,+popcnt,+aes,-avx512bitalg,-movdiri,-xsaves,-avx512er,-avx512vnni,-avx512vpopcntdq,-pconfig,-clwb,-avx512f,-clzero,-pku,+mmx,-lwp,-rdpid,-xop,+rdseed,-waitpkg,-movdir64b,-sse4a,-avx512bw,-clflushopt,+xsave,-avx512vbmi2,+64bit,-avx512vl,+invpcid,-avx512cd,+avx,-vaes,+rtm,+fma,+bmi,+rdrnd,-mwaitx,+sse4.1,+sse4.2,+avx2,-wbnoinvd,+sse,+lzcnt,+pclmul,-prefetchwt1,+f16c,+ssse3,-sgx,-shstk,+cmov,-avx512vbmi,+movbe,+xsaveopt,-avx512dq,+adx,-avx512pf,+sse3" } +attributes #1 = { nounwind "consumes-vmstate" "target-cpu"="broadwell" "target-features"="+sse2,+cx16,+sahf,-tbm,-avx512ifma,-sha,-gfni,-fma4,-vpclmulqdq,+prfchw,+bmi2,-cldemote,+fsgsbase,-ptwrite,-xsavec,+popcnt,+aes,-avx512bitalg,-movdiri,-xsaves,-avx512er,-avx512vnni,-avx512vpopcntdq,-pconfig,-clwb,-avx512f,-clzero,-pku,+mmx,-lwp,-rdpid,-xop,+rdseed,-waitpkg,-movdir64b,-sse4a,-avx512bw,-clflushopt,+xsave,-avx512vbmi2,+64bit,-avx512vl,+invpcid,-avx512cd,+avx,-vaes,+rtm,+fma,+bmi,+rdrnd,-mwaitx,+sse4.1,+sse4.2,+avx2,-wbnoinvd,+sse,+lzcnt,+pclmul,-prefetchwt1,+f16c,+ssse3,-sgx,-shstk,+cmov,-avx512vbmi,+movbe,+xsaveopt,-avx512dq,+adx,-avx512pf,+sse3" } +attributes #2 = { noinline "bytecode-size"="26" "guaranteed-to-poll" } +attributes #3 = { nounwind readonly } +attributes #4 = { argmemonly nounwind "gc-leaf-function" "target-cpu"="broadwell" "target-features"="+sse2,+cx16,+sahf,-tbm,-avx512ifma,-sha,-gfni,-fma4,-vpclmulqdq,+prfchw,+bmi2,-cldemote,+fsgsbase,-ptwrite,-xsavec,+popcnt,+aes,-avx512bitalg,-movdiri,-xsaves,-avx512er,-avx512vnni,-avx512vpopcntdq,-pconfig,-clwb,-avx512f,-clzero,-pku,+mmx,-lwp,-rdpid,-xop,+rdseed,-waitpkg,-movdir64b,-sse4a,-avx512bw,-clflushopt,+xsave,-avx512vbmi2,+64bit,-avx512vl,+invpcid,-avx512cd,+avx,-vaes,+rtm,+fma,+bmi,+rdrnd,-mwaitx,+sse4.1,+sse4.2,+avx2,-wbnoinvd,+sse,+lzcnt,+pclmul,-prefetchwt1,+f16c,+ssse3,-sgx,-shstk,+cmov,-avx512vbmi,+movbe,+xsaveopt,-avx512dq,+adx,-avx512pf,+sse3" } +attributes #5 = { cold nounwind "gc-leaf-function" } +attributes #6 = { nounwind "inline-remark"="unavailable definition" } +attributes #7 = { "callsite-frequency"="1" "inline-remark"="unavailable definition" } + +!0 = !{i1 true} +!1 = !{!"branch_weights", i32 1048575, i32 1} +!2 = !{!"branch_weights", i32 1, i32 1} +!3 = !{!"branch_weights", i32 1, i32 0} +!4 = distinct !{!4, !5} +!5 = !{!"llvm.loop.unroll.disable"} +!6 = !{!"branch_weights", i32 1, i32 3} +!7 = !{!"branch_weights", i32 3, i32 1} +!8 = distinct !{!8, !5} +!9 = distinct !{!9, !5} +!10 = !{!"branch_weights", i32 1, i32 983040} +!11 = !{} +!12 = !{!"branch_weights", i32 1, i32 176} +