Skip to content

Commit 8dfb09f

Browse files
wsmosesUbuntu
andauthored
Fix OpenMP bound calculation (rust-lang#432)
* Fix omp bound detection * Add functioning test * remove lcssa fix * Fix LLVM tests Co-authored-by: Ubuntu <[email protected]>
1 parent 47f006e commit 8dfb09f

File tree

10 files changed

+315
-161
lines changed

10 files changed

+315
-161
lines changed

enzyme/Enzyme/CacheUtility.cpp

Lines changed: 58 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -603,8 +603,6 @@ bool CacheUtility::getContext(BasicBlock *BB, LoopContext &loopContext,
603603
report_fatal_error("Couldn't get canonical IV.");
604604
}
605605

606-
LoadInst *omp_lb_post = nullptr;
607-
608606
SmallPtrSet<const SCEV *, 2> PotentialMins;
609607
SmallVector<const SCEV *, 2> Todo = {Limit};
610608
while (Todo.size()) {
@@ -628,93 +626,70 @@ bool CacheUtility::getContext(BasicBlock *BB, LoopContext &loopContext,
628626
continue;
629627
if (SM->getNumOperands() != 2)
630628
continue;
631-
if (auto C = dyn_cast<SCEVConstant>(SM->getOperand(0))) {
632-
// is minus 1
633-
if (C->getAPInt().isAllOnesValue()) {
634-
const SCEV *prev = SM->getOperand(1);
635-
while (true) {
636-
if (auto ext = dyn_cast<SCEVZeroExtendExpr>(prev)) {
637-
prev = ext->getOperand();
638-
continue;
639-
}
640-
if (auto ext = dyn_cast<SCEVSignExtendExpr>(prev)) {
641-
prev = ext->getOperand();
642-
continue;
643-
}
644-
break;
645-
}
646-
if (auto V = dyn_cast<SCEVUnknown>(prev)) {
647-
if (omp_lb_post = dyn_cast<LoadInst>(V->getValue()))
629+
for (int i = 0; i < 2; i++)
630+
if (auto C = dyn_cast<SCEVConstant>(SM->getOperand(i))) {
631+
// is minus 1
632+
if (C->getAPInt().isAllOnesValue()) {
633+
const SCEV *prev = SM->getOperand(1 - i);
634+
while (true) {
635+
if (auto ext = dyn_cast<SCEVZeroExtendExpr>(prev)) {
636+
prev = ext->getOperand();
637+
continue;
638+
}
639+
if (auto ext = dyn_cast<SCEVSignExtendExpr>(prev)) {
640+
prev = ext->getOperand();
641+
continue;
642+
}
648643
break;
649-
}
650-
}
651-
}
652-
if (auto C = dyn_cast<SCEVConstant>(SM->getOperand(1))) {
653-
// is minus 1
654-
if (C->getAPInt().isAllOnesValue()) {
655-
const SCEV *prev = SM->getOperand(0);
656-
while (true) {
657-
if (auto ext = dyn_cast<SCEVZeroExtendExpr>(prev)) {
658-
prev = ext->getOperand();
659-
continue;
660644
}
661-
if (auto ext = dyn_cast<SCEVSignExtendExpr>(prev)) {
662-
prev = ext->getOperand();
663-
continue;
645+
if (auto V = dyn_cast<SCEVUnknown>(prev)) {
646+
if (auto omp_lb_post = dyn_cast<LoadInst>(V->getValue())) {
647+
auto AI =
648+
dyn_cast<AllocaInst>(omp_lb_post->getPointerOperand());
649+
if (AI) {
650+
for (auto u : AI->users()) {
651+
CallInst *call = dyn_cast<CallInst>(u);
652+
if (!call)
653+
continue;
654+
Function *F = call->getCalledFunction();
655+
if (!F)
656+
continue;
657+
if (F->getName() == "__kmpc_for_static_init_4" ||
658+
F->getName() == "__kmpc_for_static_init_4u" ||
659+
F->getName() == "__kmpc_for_static_init_8" ||
660+
F->getName() == "__kmpc_for_static_init_8u") {
661+
Value *lb = nullptr;
662+
for (auto u : call->getArgOperand(4)->users()) {
663+
if (auto si = dyn_cast<StoreInst>(u)) {
664+
lb = si->getValueOperand();
665+
break;
666+
}
667+
}
668+
assert(lb);
669+
Value *ub = nullptr;
670+
for (auto u : call->getArgOperand(5)->users()) {
671+
if (auto si = dyn_cast<StoreInst>(u)) {
672+
ub = si->getValueOperand();
673+
break;
674+
}
675+
}
676+
assert(ub);
677+
IRBuilder<> post(omp_lb_post->getNextNode());
678+
loopContexts[L].allocLimit = post.CreateZExtOrTrunc(
679+
post.CreateSub(ub, lb), CanonicalIV->getType());
680+
loopContexts[L].offset = post.CreateZExtOrTrunc(
681+
post.CreateSub(omp_lb_post, lb, "", true, true),
682+
CanonicalIV->getType());
683+
goto endOMP;
684+
}
685+
}
686+
}
687+
}
664688
}
665-
break;
666-
}
667-
if (auto V = dyn_cast<SCEVUnknown>(prev)) {
668-
if (omp_lb_post = dyn_cast<LoadInst>(V->getValue()))
669-
break;
670689
}
671690
}
672-
}
673-
}
674-
CallInst *initCall = nullptr;
675-
if (omp_lb_post) {
676-
auto AI = dyn_cast<AllocaInst>(omp_lb_post->getPointerOperand());
677-
if (AI) {
678-
for (auto u : AI->users()) {
679-
CallInst *call = dyn_cast<CallInst>(u);
680-
if (!call)
681-
continue;
682-
Function *F = call->getCalledFunction();
683-
if (!F)
684-
continue;
685-
if (F->getName() == "__kmpc_for_static_init_4" ||
686-
F->getName() == "__kmpc_for_static_init_4u" ||
687-
F->getName() == "__kmpc_for_static_init_8" ||
688-
F->getName() == "__kmpc_for_static_init_8u") {
689-
initCall = call;
690-
}
691-
}
692-
}
693-
}
694-
if (initCall) {
695-
Value *lb = nullptr;
696-
for (auto u : initCall->getArgOperand(4)->users()) {
697-
if (auto si = dyn_cast<StoreInst>(u)) {
698-
lb = si->getValueOperand();
699-
break;
700-
}
701-
}
702-
assert(lb);
703-
Value *ub = nullptr;
704-
for (auto u : initCall->getArgOperand(5)->users()) {
705-
if (auto si = dyn_cast<StoreInst>(u)) {
706-
ub = si->getValueOperand();
707-
break;
708-
}
709-
}
710-
assert(ub);
711-
IRBuilder<> post(omp_lb_post->getNextNode());
712-
loopContexts[L].allocLimit = post.CreateZExtOrTrunc(
713-
post.CreateSub(ub, lb), CanonicalIV->getType());
714-
loopContexts[L].offset = post.CreateZExtOrTrunc(
715-
post.CreateSub(omp_lb_post, lb, "", true, true),
716-
CanonicalIV->getType());
717691
}
692+
endOMP:;
718693

719694
if (Limit->getType() != CanonicalIV->getType())
720695
Limit = SE.getZeroExtendExpr(Limit, CanonicalIV->getType());

enzyme/Enzyme/FunctionUtils.cpp

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,51 @@ void CanonicalizeLoops(Function *F, FunctionAnalysisManager &FAM) {
824824
FAM.invalidate(*F, PA);
825825
}
826826

827+
void RemoveRedundantPHI(Function *F, FunctionAnalysisManager &FAM) {
828+
DominatorTree &DT = FAM.getResult<DominatorTreeAnalysis>(*F);
829+
for (BasicBlock &BB : *F) {
830+
for (BasicBlock::iterator II = BB.begin(); isa<PHINode>(II);) {
831+
PHINode *PN = cast<PHINode>(II);
832+
++II;
833+
SmallPtrSet<Value *, 2> vals;
834+
SmallPtrSet<PHINode *, 2> done;
835+
SmallVector<PHINode *, 2> todo = {PN};
836+
while (todo.size() > 0) {
837+
PHINode *N = todo.back();
838+
todo.pop_back();
839+
if (done.count(N))
840+
continue;
841+
done.insert(N);
842+
if (vals.size() == 0 && todo.size() == 0 && PN != N &&
843+
DT.dominates(N, PN)) {
844+
vals.insert(N);
845+
break;
846+
}
847+
for (auto &v : N->incoming_values()) {
848+
if (isa<UndefValue>(v))
849+
continue;
850+
if (auto NN = dyn_cast<PHINode>(v)) {
851+
todo.push_back(NN);
852+
continue;
853+
}
854+
vals.insert(v);
855+
if (vals.size() > 1)
856+
break;
857+
}
858+
if (vals.size() > 1)
859+
break;
860+
}
861+
if (vals.size() == 1) {
862+
auto V = *vals.begin();
863+
if (!isa<Instruction>(V) || DT.dominates(cast<Instruction>(V), PN)) {
864+
PN->replaceAllUsesWith(V);
865+
PN->eraseFromParent();
866+
}
867+
}
868+
}
869+
}
870+
}
871+
827872
PreProcessCache::PreProcessCache() {
828873
MAM.registerPass([&] { return FunctionAnalysisManagerModuleProxy(FAM); });
829874
FAM.registerPass([&] { return ModuleAnalysisManagerFunctionProxy(MAM); });
@@ -1381,10 +1426,6 @@ Function *PreProcessCache::preprocessForClone(Function *F,
13811426

13821427
ReplaceReallocs(NewF);
13831428

1384-
// Run LoopSimplifyPass to ensure preheaders exist on all loops
1385-
auto PA = LoopSimplifyPass().run(*NewF, FAM);
1386-
FAM.invalidate(*NewF, PA);
1387-
13881429
if (mode == DerivativeMode::ReverseModePrimal ||
13891430
mode == DerivativeMode::ReverseModeGradient ||
13901431
mode == DerivativeMode::ReverseModeCombined) {
@@ -1394,6 +1435,13 @@ Function *PreProcessCache::preprocessForClone(Function *F,
13941435
}
13951436

13961437
CanonicalizeLoops(NewF, FAM);
1438+
RemoveRedundantPHI(NewF, FAM);
1439+
1440+
// Run LoopSimplifyPass to ensure preheaders exist on all loops
1441+
{
1442+
auto PA = LoopSimplifyPass().run(*NewF, FAM);
1443+
FAM.invalidate(*NewF, PA);
1444+
}
13971445

13981446
{
13991447
std::vector<Instruction *> ToErase;
@@ -1426,6 +1474,7 @@ Function *PreProcessCache::preprocessForClone(Function *F,
14261474
PA.preserve<PhiValuesAnalysis>();
14271475
#endif
14281476
FAM.invalidate(*NewF, PA);
1477+
14291478
if (EnzymeNameInstructions) {
14301479
for (auto &Arg : NewF->args()) {
14311480
if (!Arg.hasName())

enzyme/test/Enzyme/ReverseMode/bounds.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ attributes #10 = { cold }
230230
; CHECK-NEXT: br label %for.body
231231

232232
; CHECK: for.body: ; preds = %for.body, %for.body.preheader
233-
; CHECK-NEXT: %iv = phi i64 [ 0, %for.body.preheader ], [ %iv.next, %for.body ]
233+
; CHECK-NEXT: %iv = phi i64 [ %iv.next, %for.body ], [ 0, %for.body.preheader ]
234234
; CHECK-DAG: %iv.next = add nuw nsw i64 %iv, 1
235235
; CHECK-DAG: %0 = trunc i64 %iv to i32
236236
; CHECK-NEXT: call void @augmented_lookup(float* %a, float* %"a'", i32 %0, i32 %bound)

enzyme/test/Enzyme/ReverseMode/bounds2.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ attributes #10 = { cold }
230230
; CHECK-NEXT: br label %for.body
231231

232232
; CHECK: for.body: ; preds = %for.body, %for.body.preheader
233-
; CHECK-NEXT: %iv = phi i64 [ 0, %for.body.preheader ], [ %iv.next, %for.body ]
233+
; CHECK-NEXT: %iv = phi i64 [ %iv.next, %for.body ], [ 0, %for.body.preheader ]
234234
; CHECK-DAG: %iv.next = add nuw nsw i64 %iv, 1
235235
; CHECK-DAG: %0 = trunc i64 %iv to i32
236236
; CHECK-NEXT: @augmented_lookup(float* %a, float* %"a'", i32 %0, i32 %bound)

enzyme/test/Enzyme/ReverseMode/callundefinphi.ll

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -537,24 +537,28 @@ attributes #22 = { readnone speculatable }
537537

538538
; CHECK: invertfor.cond10.preheader.i: ; preds = %invertfor.body14.i
539539
; CHECK-NEXT: %[[iv3cmp:.+]] = icmp eq i64 %"iv3'ac.0", 0
540+
; CHECK-NEXT: %[[g15:.+]] = bitcast i64 %[[g29:.+]] to double
541+
; CHECK-NEXT: %[[g16:.+]] = bitcast i64 %[[sel:.+]] to double
542+
; CHECK-NEXT: %[[g17:.+]] = fadd fast double %[[g15]], %[[g16]]
543+
; CHECK-NEXT: %[[g18:.+]] = bitcast double %[[g17]] to i64
540544
; CHECK-NEXT: br i1 %[[iv3cmp]], label %invertfor.body.i, label %incinvertfor.cond10.preheader.i
541545

542546
; CHECK: incinvertfor.cond10.preheader.i: ; preds = %invertfor.cond10.preheader.i
543547
; CHECK-NEXT: %[[subiv3:.+]] = add nsw i64 %"iv3'ac.0", -1
544548
; CHECK-NEXT: br label %invertfor.cond.cleanup13.i
545549

546550
; CHECK: invertfor.cond.cleanup13.i: ; preds = %for.cond.cleanup13.i, %incinvertfor.cond10.preheader.i
547-
; CHECK-NEXT: %"add.i.i.lcssa'de.0" = phi double [ 0.000000e+00, %incinvertfor.cond10.preheader.i ], [ %differeturn, %for.cond.cleanup13.i ]
548-
; CHECK-NEXT: %".lcssa'de.0" = phi i64 [ %[[sel:.+]], %incinvertfor.cond10.preheader.i ], [ 0, %for.cond.cleanup13.i ]
551+
; CHECK-NEXT: %[[lcssade:.+]] = phi i64 [ %[[g18]], %incinvertfor.cond10.preheader.i ], [ 0, %for.cond.cleanup13.i ]
552+
; CHECK-NEXT: %[[addlcssa:.+]] = phi double [ 0.000000e+00, %incinvertfor.cond10.preheader.i ], [ %differeturn, %for.cond.cleanup13.i ]
549553
; CHECK-NEXT: %"iv3'ac.0" = phi i64 [ %[[subiv3]], %incinvertfor.cond10.preheader.i ], [ 3, %for.cond.cleanup13.i ]
550554
; CHECK-NEXT: br label %invertfor.body14.i
551555

552556
; CHECK: invertfor.body14.i: ; preds = %incinvertfor.body14.i, %invertfor.cond.cleanup13.i
553-
; CHECK-NEXT: %[[de11:.+]] = phi i64 [ %".lcssa'de.0", %invertfor.cond.cleanup13.i ], [ %[[bcsel:.+]], %incinvertfor.body14.i ]
554-
; CHECK-NEXT: %"add.i.i'de.1" = phi double [ %"add.i.i.lcssa'de.0", %invertfor.cond.cleanup13.i ], [ 0.000000e+00, %incinvertfor.body14.i ]
557+
; CHECK-NEXT: %[[de11:.+]] = phi i64 [ %[[lcssade]], %invertfor.cond.cleanup13.i ], [ %[[bcsel:.+]], %incinvertfor.body14.i ]
558+
; CHECK-NEXT: %[[addiide1:.+]] = phi double [ %[[addlcssa]], %invertfor.cond.cleanup13.i ], [ 0.000000e+00, %incinvertfor.body14.i ]
555559
; CHECK-NEXT: %"iv5'ac.0" = phi i64 [ 3, %invertfor.cond.cleanup13.i ], [ %[[iv5inc:.+]], %incinvertfor.body14.i ]
556560
; CHECK-NEXT: %[[padd:.+]] = bitcast i64 %[[de11]] to double
557-
; CHECK-NEXT: %[[aadd:.+]] = fadd fast double %"add.i.i'de.1", %[[padd]]
561+
; CHECK-NEXT: %[[aadd:.+]] = fadd fast double %[[addiide1]], %[[padd]]
558562
; CHECK-NEXT: %[[abc:.+]] = bitcast double %[[aadd]] to i64
559563
; CHECK-NEXT: %mul.i.i_unwrap = mul nsw i64 4, %"iv3'ac.0"
560564
; CHECK-NEXT: %add.i4.i_unwrap = add nsw i64 %mul.i.i_unwrap, %"iv5'ac.0"
@@ -566,6 +570,8 @@ attributes #22 = { readnone speculatable }
566570
; CHECK-NEXT: %[[tostore:.+]] = bitcast double %[[auw1]] to i64
567571
; CHECK-NEXT: store i64 %[[tostore]], i64* %[[bcup]], align 8
568572
; CHECK-NEXT: %[[iv5cmp:.+]] = icmp eq i64 %"iv5'ac.0", 0
573+
; CHECK-NEXT: %[[nivcmp:.+]] = xor i1 %[[iv5cmp]], true
574+
; CHECK-NEXT: %[[g29:.+]] = select i1 %[[nivcmp]], i64 %[[abc]], i64 0
569575
; CHECK-NEXT: %[[bcsel:.+]] = bitcast double %[[aadd]] to i64
570576
; CHECK-NEXT: %[[sel]] = select i1 %[[iv5cmp]], i64 %[[bcsel]], i64 0
571577
; CHECK-NEXT: br i1 %[[iv5cmp]], label %invertfor.cond10.preheader.i, label %incinvertfor.body14.i

enzyme/test/Enzyme/ReverseMode/callundefinphi2.ll

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ attributes #22 = { readnone speculatable }
276276
; CHECK-NEXT: br label %for.cond10.preheader.i
277277

278278
; CHECK: for.cond10.preheader.i: ; preds = %for.cond.cleanup13.i, %for.cond10.preheader.i.preheader
279-
; CHECK-NEXT: %iv3 = phi i64 [ 0, %for.cond10.preheader.i.preheader ], [ %iv.next4, %for.cond.cleanup13.i ]
279+
; CHECK-NEXT: %iv3 = phi i64 [ %iv.next4, %for.cond.cleanup13.i ], [ 0, %for.cond10.preheader.i.preheader ]
280280
; CHECK-NEXT: %res.i.sroa.0.1 = phi i64 [ %[[res:.+]], %for.cond.cleanup13.i ], [ 0, %for.cond10.preheader.i.preheader ]
281281
; CHECK-NEXT: %iv.next4 = add nuw nsw i64 %iv3, 1
282282
; CHECK-NEXT: %mul.i.i = mul nsw i64 4, %iv3
@@ -351,21 +351,25 @@ attributes #22 = { readnone speculatable }
351351

352352
; CHECK: invertfor.cond10.preheader.i: ; preds = %invertfor.body14.i
353353
; CHECK-NEXT: %[[iv3cmp:.+]] = icmp eq i64 %"iv3'ac.0", 0
354+
; CHECK-NEXT: %[[g15:.+]] = bitcast i64 %[[g29:.+]] to double
355+
; CHECK-NEXT: %[[g16:.+]] = bitcast i64 %[[sel:.+]] to double
356+
; CHECK-NEXT: %[[g17:.+]] = fadd fast double %[[g15]], %[[g16]]
357+
; CHECK-NEXT: %[[g18:.+]] = bitcast double %[[g17]] to i64
354358
; CHECK-NEXT: br i1 %[[iv3cmp]], label %invertfor.cond10.preheader.i.preheader, label %incinvertfor.cond10.preheader.i
355359

356360
; CHECK: incinvertfor.cond10.preheader.i: ; preds = %invertfor.cond10.preheader.i
357361
; CHECK-NEXT: %[[iv3sub:.+]] = add nsw i64 %"iv3'ac.0", -1
358362
; CHECK-NEXT: br label %invertfor.cond.cleanup13.i
359363

360364
; CHECK: invertfor.cond.cleanup13.i: ; preds = %for.cond.cleanup13.i, %incinvertfor.cond10.preheader.i
361-
; CHECK-NEXT: %"add.i.i.lcssa'de.0" = phi double [ 0.000000e+00, %incinvertfor.cond10.preheader.i ], [ %differeturn, %for.cond.cleanup13.i ]
362-
; CHECK-NEXT: %".lcssa'de.0" = phi i64 [ %[[selcsa:.+]], %incinvertfor.cond10.preheader.i ], [ 0, %for.cond.cleanup13.i ]
365+
; CHECK-NEXT: %[[lcssade:.+]] = phi i64 [ %[[g18]], %incinvertfor.cond10.preheader.i ], [ 0, %for.cond.cleanup13.i ]
366+
; CHECK-NEXT: %[[addlcssa:.+]] = phi double [ 0.000000e+00, %incinvertfor.cond10.preheader.i ], [ %differeturn, %for.cond.cleanup13.i ]
363367
; CHECK-NEXT: %"iv3'ac.0" = phi i64 [ %[[iv3sub]], %incinvertfor.cond10.preheader.i ], [ 3, %for.cond.cleanup13.i ]
364368
; CHECK-NEXT: br label %invertfor.body14.i
365369

366370
; CHECK: invertfor.body14.i: ; preds = %incinvertfor.body14.i, %invertfor.cond.cleanup13.i
367-
; CHECK-NEXT: %[[de11:.+]] = phi i64 [ %".lcssa'de.0", %invertfor.cond.cleanup13.i ], [ %[[dessa:.+]], %incinvertfor.body14.i ]
368-
; CHECK-NEXT: %"add.i.i'de.1" = phi double [ %"add.i.i.lcssa'de.0", %invertfor.cond.cleanup13.i ], [ 0.000000e+00, %incinvertfor.body14.i ]
371+
; CHECK-NEXT: %[[de11:.+]] = phi i64 [ %[[lcssade]], %invertfor.cond.cleanup13.i ], [ %[[dessa:.+]], %incinvertfor.body14.i ]
372+
; CHECK-NEXT: %[[addiide1:.+]] = phi double [ %[[addlcssa]], %invertfor.cond.cleanup13.i ], [ 0.000000e+00, %incinvertfor.body14.i ]
369373
; CHECK-NEXT: %"iv5'ac.0" = phi i64 [ 3, %invertfor.cond.cleanup13.i ], [ %[[iv5sub:.+]], %incinvertfor.body14.i ]
370374
; CHECK-NEXT: %[[dedd:.+]] = bitcast i64 %[[de11:.+]] to double
371375
; CHECK-NEXT: %[[fad:.+]] = fadd fast double %"add.i.i'de.1", %[[dedd]]
@@ -384,8 +388,10 @@ attributes #22 = { readnone speculatable }
384388
; CHECK-NEXT: %[[iipost:.+]] = bitcast double %[[ddpost]] to i64
385389
; CHECK-NEXT: store i64 %[[iipost]], i64* %[[ipc16]], align 8
386390
; CHECK-NEXT: %[[iv5cmp:.+]] = icmp eq i64 %"iv5'ac.0", 0
391+
; CHECK-NEXT: %[[nivcmp:.+]] = xor i1 %[[iv5cmp]], true
392+
; CHECK-NEXT: %[[g29:.+]] = select i1 %[[nivcmp]], i64 %[[dessa]], i64 0
387393
; CHECK-NEXT: %[[selo2:.+]] = bitcast double %[[m2a]] to i64
388-
; CHECK-NEXT: %[[selcsa]] = select{{( fast)?}} i1 %[[iv5cmp]], i64 %[[selo2]], i64 0
394+
; CHECK-NEXT: %[[sel]] = select{{( fast)?}} i1 %[[iv5cmp]], i64 %[[selo2]], i64 0
389395
; CHECK-NEXT: br i1 %[[iv5cmp]], label %invertfor.cond10.preheader.i, label %incinvertfor.body14.i
390396

391397
; CHECK: incinvertfor.body14.i: ; preds = %invertfor.body14.i

enzyme/test/Enzyme/ReverseMode/dynamicphi.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ attributes #1 = { noinline nounwind uwtable }
6666
; CHECK: for.outerbody:
6767
; CHECK-NEXT: %[[loopLimit_cache3:.+]] = phi i64* [ null, %entry ], [ %[[loopLimit_realloccast]], %for.outerbody.loopexit ]
6868
; CHECK-NEXT: %phi_cache.0 = phi double** [ null, %entry ], [ %[[phi_realloccast:.+]], %for.outerbody.loopexit ]
69-
; CHECK-NEXT: %iv = phi i64 [ %iv.next, %for.outerbody.loopexit ], [ 0, %entry ]
69+
; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.outerbody.loopexit ]
7070
; CHECK-NEXT: %iv.next = add nuw nsw i64 %iv, 1
7171
; CHECK-NEXT: %1 = bitcast double** %phi_cache.0 to i8*
7272
; CHECK-NEXT: %2 = and i64 %iv.next, 1
@@ -154,8 +154,8 @@ attributes #1 = { noinline nounwind uwtable }
154154
; CHECK-NEXT: ret { double } %[[a9]]
155155

156156
; CHECK: invertfor.outerbody:
157-
; CHECK-NEXT: %"outeradd'de.0" = phi double [ %[[a16:.+]], %invertfor.body.ph ], [ %differeturn, %[[nouterbody]] ]
158157
; CHECK-NEXT: %"x'de.0" = phi double [ %[[a14:.+]], %invertfor.body.ph ], [ 0.000000e+00, %[[nouterbody]] ]
158+
; CHECK-NEXT: %"outeradd'de.0" = phi double [ %[[a16:.+]], %invertfor.body.ph ], [ %differeturn, %[[nouterbody]] ]
159159
; CHECK-NEXT: %"iv'ac.0" = phi i64 [ %[[a11:.+]], %invertfor.body.ph ], [ %iv, %[[nouterbody]] ]
160160
; CHECK-NEXT: %[[a10:.+]] = icmp eq i64 %"iv'ac.0", 0
161161
; CHECK-NEXT: br i1 %[[a10]], label %invertentry, label %incinvertfor.outerbody

0 commit comments

Comments
 (0)