diff --git a/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp b/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp @@ -31,6 +31,7 @@ #include "llvm/Support/KnownBits.h" #include "llvm/Transforms/Utils/IntegerDivision.h" #include "llvm/Transforms/Utils/Local.h" +#include #define DEBUG_TYPE "amdgpu-codegenprepare" @@ -52,17 +53,17 @@ cl::init(true)); static cl::opt - ScalarizeLargePHIs("amdgpu-codegenprepare-break-large-phis", - cl::desc("Break large PHI nodes for DAGISel"), - cl::ReallyHidden, cl::init(true)); + BreakLargePHIs("amdgpu-codegenprepare-break-large-phis", + cl::desc("Break large PHI nodes for DAGISel"), + cl::ReallyHidden, cl::init(true)); static cl::opt - ForceScalarizeLargePHIs("amdgpu-codegenprepare-force-break-large-phis", - cl::desc("For testing purposes, always break large " - "PHIs even if it isn't profitable."), - cl::ReallyHidden, cl::init(false)); + ForceBreakLargePHIs("amdgpu-codegenprepare-force-break-large-phis", + cl::desc("For testing purposes, always break large " + "PHIs even if it isn't profitable."), + cl::ReallyHidden, cl::init(false)); -static cl::opt ScalarizeLargePHIsThreshold( +static cl::opt BreakLargePHIsThreshold( "amdgpu-codegenprepare-break-large-phis-threshold", cl::desc("Minimum type size in bits for breaking large PHI nodes"), cl::ReallyHidden, cl::init(32)); @@ -319,6 +320,8 @@ } // end anonymous namespace bool AMDGPUCodeGenPrepareImpl::run(Function &F) { + BreakPhiNodesCache.clear(); + bool MadeChange = false; Function::iterator NextBB; @@ -1777,47 +1780,79 @@ return false; } +static void collectPHINodes(const PHINode &I, + DenseSet &SeenPHIs) { + const auto [It, Inserted] = SeenPHIs.insert(&I); + if (!Inserted) + return; + + for (const Value *Inc : I.incoming_values()) { + if (const auto *PhiInc = dyn_cast(Inc)) + collectPHINodes(*PhiInc, SeenPHIs); + } + + for (const User *U : I.users()) { + if (const auto *PhiU = dyn_cast(U)) + collectPHINodes(*PhiU, SeenPHIs); + } +} + bool AMDGPUCodeGenPrepareImpl::canBreakPHINode(const PHINode &I) { - // Check in the cache, or add an entry for this node. - // - // We init with false because we consider all PHI nodes unbreakable until we - // reach a conclusion. Doing the opposite - assuming they're break-able until - // proven otherwise - can be harmful in some pathological cases so we're - // conservative for now. - const auto [It, DidInsert] = BreakPhiNodesCache.insert({&I, false}); - if (!DidInsert) + // Check in the cache first. + if (const auto It = BreakPhiNodesCache.find(&I); + It != BreakPhiNodesCache.end()) return It->second; - // This function may recurse, so to guard against infinite looping, this PHI - // is conservatively considered unbreakable until we reach a conclusion. - - // Don't break PHIs that have no interesting incoming values. That is, where - // there is no clear opportunity to fold the "extractelement" instructions we - // would add. - // - // Note: IC does not run after this pass, so we're only interested in the - // foldings that the DAG combiner can do. - if (none_of(I.incoming_values(), - [&](Value *V) { return isInterestingPHIIncomingValue(V); })) - return false; + // We consider PHI nodes as part of "chains", so given a PHI node I, we + // recursively consider all its users and incoming values that are also PHI + // nodes. We then make a decision about all of those PHIs at once. Either they + // all get broken up, or none of them do. That way, we avoid cases where a + // single PHI is/is not broken and we end up reforming/exploding a vector + // multiple times, or even worse, doing it in a loop. + DenseSet WorkList; + collectPHINodes(I, WorkList); + +#ifndef NDEBUG + // Check that none of the PHI nodes in the worklist are in the map. If some of + // them are, it means we're not good enough at collecting related PHIs. + for (const PHINode *WLP : WorkList) { + assert(BreakPhiNodesCache.count(WLP) == 0); + } +#endif - // Now, check users for unbreakable PHI nodes. If we have an unbreakable PHI - // node as user, we don't want to break this PHI either because it's unlikely - // to be beneficial. We would just explode the vector and reassemble it - // directly, wasting instructions. + // To consider a PHI profitable to break, we need to see some interesting + // incoming values. At least 2/3rd of all PHIs in the worklist must have one + // to consider all PHIs breakable. // - // In the case where multiple users are PHI nodes, we want at least half of - // them to be breakable. - int Score = 0; - for (const Value *U : I.users()) { - if (const auto *PU = dyn_cast(U)) - Score += canBreakPHINode(*PU) ? 1 : -1; + // This threshold has been determined through testing. + const auto Threshold = ceil((WorkList.size() / 3.0) * 2); + unsigned NumBreakablePHIs = 0; + bool CanBreak = false; + for (const PHINode *Cur : WorkList) { + // Metadata used by tests. + if (Cur->getMetadata("amdgpu.unbreakablephi")) + continue; + + // Don't break PHIs that have no interesting incoming values. That is, where + // there is no clear opportunity to fold the "extractelement" instructions + // we would add. + // + // Note: IC does not run after this pass, so we're only interested in the + // foldings that the DAG combiner can do. + if (any_of(Cur->incoming_values(), + [](Value *V) { return isInterestingPHIIncomingValue(V); }) || + Cur->getMetadata("amdgpu.breakablephi")) { + if (++NumBreakablePHIs >= Threshold) { + CanBreak = true; + break; + } + } } - if (Score < 0) - return false; + for (const PHINode *Cur : WorkList) + BreakPhiNodesCache[Cur] = CanBreak; - return BreakPhiNodesCache[&I] = true; + return CanBreak; } /// Helper class for "break large PHIs" (visitPHINode). @@ -1898,14 +1933,15 @@ // operations with most elements being "undef". This inhibits a lot of // optimization opportunities and can result in unreasonably high register // pressure and the inevitable stack spilling. - if (!ScalarizeLargePHIs || getCGPassBuilderOption().EnableGlobalISelOption) + if (!BreakLargePHIs || getCGPassBuilderOption().EnableGlobalISelOption) return false; FixedVectorType *FVT = dyn_cast(I.getType()); - if (!FVT || DL->getTypeSizeInBits(FVT) <= ScalarizeLargePHIsThreshold) + if (!FVT || FVT->getNumElements() == 1 || + DL->getTypeSizeInBits(FVT) <= BreakLargePHIsThreshold) return false; - if (!ForceScalarizeLargePHIs && !canBreakPHINode(I)) + if (!ForceBreakLargePHIs && !canBreakPHINode(I)) return false; std::vector Slices; @@ -1930,8 +1966,7 @@ Slices.emplace_back(EltTy, Idx, 1); } - if (Slices.size() == 1) - return false; + assert(Slices.size() > 1); // Create one PHI per vector piece. The "VectorSlice" class takes care of // creating the necessary instruction to extract the relevant slices of each diff --git a/llvm/test/CodeGen/AMDGPU/amdgpu-codegenprepare-break-large-phis-heuristics.ll b/llvm/test/CodeGen/AMDGPU/amdgpu-codegenprepare-break-large-phis-heuristics.ll --- a/llvm/test/CodeGen/AMDGPU/amdgpu-codegenprepare-break-large-phis-heuristics.ll +++ b/llvm/test/CodeGen/AMDGPU/amdgpu-codegenprepare-break-large-phis-heuristics.ll @@ -707,6 +707,11 @@ ; CHECK-NEXT: [[LARGEPHI_INSERTSLICE3:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE2]], double [[TMP3]], i64 3 ; CHECK-NEXT: [[LARGEPHI_INSERTSLICE4:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE3]], double [[TMP4]], i64 4 ; CHECK-NEXT: store <5 x double> [[LARGEPHI_INSERTSLICE4]], ptr [[OUT:%.*]], align 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE1:%.*]] = extractelement <5 x double> [[IN]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE3:%.*]] = extractelement <5 x double> [[IN]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE5:%.*]] = extractelement <5 x double> [[IN]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE7:%.*]] = extractelement <5 x double> [[IN]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE9:%.*]] = extractelement <5 x double> [[IN]], i64 4 ; CHECK-NEXT: br i1 [[COND2:%.*]], label [[THEN1:%.*]], label [[END:%.*]] ; CHECK: then1: ; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE01:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 0 @@ -714,21 +719,35 @@ ; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE43:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 2 ; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE64:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 3 ; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE85:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE011:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE212:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE413:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE614:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE815:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 4 ; CHECK-NEXT: br label [[END]] ; CHECK: end: -; CHECK-NEXT: [[ENDVAL:%.*]] = phi <5 x double> [ [[LARGEPHI_INSERTSLICE4]], [[THEN1]] ], [ [[IN]], [[FINALLY]] ] -; CHECK-NEXT: [[TMP5:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE01]], [[THEN1]] ], [ 0.000000e+00, [[FINALLY]] ] -; CHECK-NEXT: [[TMP6:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE22]], [[THEN1]] ], [ 0.000000e+00, [[FINALLY]] ] -; CHECK-NEXT: [[TMP7:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE43]], [[THEN1]] ], [ 0.000000e+00, [[FINALLY]] ] -; CHECK-NEXT: [[TMP8:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE64]], [[THEN1]] ], [ 0.000000e+00, [[FINALLY]] ] -; CHECK-NEXT: [[TMP9:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE85]], [[THEN1]] ], [ 0.000000e+00, [[FINALLY]] ] +; CHECK-NEXT: [[TMP5:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE01]], [[THEN1]] ], [ [[LARGEPHI_EXTRACTSLICE1]], [[FINALLY]] ] +; CHECK-NEXT: [[TMP6:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE22]], [[THEN1]] ], [ [[LARGEPHI_EXTRACTSLICE3]], [[FINALLY]] ] +; CHECK-NEXT: [[TMP7:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE43]], [[THEN1]] ], [ [[LARGEPHI_EXTRACTSLICE5]], [[FINALLY]] ] +; CHECK-NEXT: [[TMP8:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE64]], [[THEN1]] ], [ [[LARGEPHI_EXTRACTSLICE7]], [[FINALLY]] ] +; CHECK-NEXT: [[TMP9:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE85]], [[THEN1]] ], [ [[LARGEPHI_EXTRACTSLICE9]], [[FINALLY]] ] +; CHECK-NEXT: [[TMP10:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE011]], [[THEN1]] ], [ 0.000000e+00, [[FINALLY]] ] +; CHECK-NEXT: [[TMP11:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE212]], [[THEN1]] ], [ 0.000000e+00, [[FINALLY]] ] +; CHECK-NEXT: [[TMP12:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE413]], [[THEN1]] ], [ 0.000000e+00, [[FINALLY]] ] +; CHECK-NEXT: [[TMP13:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE614]], [[THEN1]] ], [ 0.000000e+00, [[FINALLY]] ] +; CHECK-NEXT: [[TMP14:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE815]], [[THEN1]] ], [ 0.000000e+00, [[FINALLY]] ] +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE016:%.*]] = insertelement <5 x double> poison, double [[TMP10]], i64 0 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE117:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE016]], double [[TMP11]], i64 1 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE218:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE117]], double [[TMP12]], i64 2 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE319:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE218]], double [[TMP13]], i64 3 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE420:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE319]], double [[TMP14]], i64 4 ; CHECK-NEXT: [[LARGEPHI_INSERTSLICE06:%.*]] = insertelement <5 x double> poison, double [[TMP5]], i64 0 ; CHECK-NEXT: [[LARGEPHI_INSERTSLICE17:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE06]], double [[TMP6]], i64 1 ; CHECK-NEXT: [[LARGEPHI_INSERTSLICE28:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE17]], double [[TMP7]], i64 2 ; CHECK-NEXT: [[LARGEPHI_INSERTSLICE39:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE28]], double [[TMP8]], i64 3 ; CHECK-NEXT: [[LARGEPHI_INSERTSLICE410:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE39]], double [[TMP9]], i64 4 -; CHECK-NEXT: store <5 x double> [[ENDVAL]], ptr [[OUT]], align 1 ; CHECK-NEXT: store <5 x double> [[LARGEPHI_INSERTSLICE410]], ptr [[OUT]], align 1 +; CHECK-NEXT: store <5 x double> [[LARGEPHI_INSERTSLICE420]], ptr [[OUT]], align 1 ; CHECK-NEXT: ret void ; entry: @@ -784,3 +803,530 @@ end: ret void } + + +define amdgpu_kernel void @test_breakable_chain_2_out_of_4(<5 x double> %in, ptr %out, i1 %cond) { +; CHECK-LABEL: @test_breakable_chain_2_out_of_4( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[COND:%.*]], label [[COND0_TRUE:%.*]], label [[COND0_END:%.*]] +; CHECK: cond0.true: +; CHECK-NEXT: [[X:%.*]] = insertelement <5 x double> [[IN:%.*]], double 3.140000e+00, i64 3 +; CHECK-NEXT: br label [[COND0_END]] +; CHECK: cond0.end: +; CHECK-NEXT: [[VAL_0:%.*]] = phi <5 x double> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[X]], [[COND0_TRUE]] ], !amdgpu.breakablephi !0 +; CHECK-NEXT: br i1 [[COND]], label [[COND1_TRUE:%.*]], label [[COND1_END:%.*]] +; CHECK: cond1.true: +; CHECK-NEXT: [[Y:%.*]] = insertelement <5 x double> [[VAL_0]], double 6.140000e+00, i64 2 +; CHECK-NEXT: br label [[COND1_END]] +; CHECK: cond1.end: +; CHECK-NEXT: [[VAL_1:%.*]] = phi <5 x double> [ [[VAL_0]], [[COND0_END]] ], [ [[Y]], [[COND1_TRUE]] ], !amdgpu.breakablephi !0 +; CHECK-NEXT: br i1 [[COND]], label [[COND2_TRUE:%.*]], label [[COND2_END:%.*]] +; CHECK: cond2.true: +; CHECK-NEXT: [[Z:%.*]] = insertelement <5 x double> [[VAL_0]], double 6.140000e+00, i64 2 +; CHECK-NEXT: br i1 [[COND]], label [[COND2_END]], label [[END:%.*]] +; CHECK: cond2.end: +; CHECK-NEXT: [[VAL_2:%.*]] = phi <5 x double> [ [[VAL_1]], [[COND1_END]] ], [ [[Z]], [[COND2_TRUE]] ], !amdgpu.unbreakablephi !0 +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: [[ENDVAL:%.*]] = phi <5 x double> [ [[VAL_2]], [[COND2_END]] ], [ [[Z]], [[COND2_TRUE]] ], !amdgpu.unbreakablephi !0 +; CHECK-NEXT: store <5 x double> [[ENDVAL]], ptr [[OUT:%.*]], align 1 +; CHECK-NEXT: ret void +; +entry: + br i1 %cond, label %cond0.true, label %cond0.end + +cond0.true: + %x = insertelement <5 x double> %in, double 3.140000e+00, i64 3 + br label %cond0.end + +cond0.end: + %val.0 = phi <5 x double> [ zeroinitializer, %entry ], [ %x, %cond0.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond1.true, label %cond1.end + +cond1.true: + %y = insertelement <5 x double> %val.0, double 6.140000e+00, i64 2 + br label %cond1.end + +cond1.end: + %val.1 = phi <5 x double> [ %val.0, %cond0.end ], [ %y, %cond1.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond2.true, label %cond2.end + +cond2.true: + %z = insertelement <5 x double> %val.0, double 6.140000e+00, i64 2 + br i1 %cond, label %cond2.end, label %end + +cond2.end: + %val.2 = phi <5 x double> [ %val.1, %cond1.end ], [ %z, %cond2.true ], !amdgpu.unbreakablephi !0 + br label %end + +end: + %endval = phi <5 x double> [ %val.2, %cond2.end ], [ %z, %cond2.true ], !amdgpu.unbreakablephi !0 + store <5 x double> %endval, ptr %out, align 1 + ret void +} + +define amdgpu_kernel void @test_breakable_chain_3_out_of_4(<5 x double> %in, ptr %out, i1 %cond) { +; CHECK-LABEL: @test_breakable_chain_3_out_of_4( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[COND:%.*]], label [[COND0_TRUE:%.*]], label [[COND0_END:%.*]] +; CHECK: cond0.true: +; CHECK-NEXT: [[X:%.*]] = insertelement <5 x double> [[IN:%.*]], double 3.140000e+00, i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE1:%.*]] = extractelement <5 x double> [[X]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE3:%.*]] = extractelement <5 x double> [[X]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE5:%.*]] = extractelement <5 x double> [[X]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE7:%.*]] = extractelement <5 x double> [[X]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE9:%.*]] = extractelement <5 x double> [[X]], i64 4 +; CHECK-NEXT: br label [[COND0_END]] +; CHECK: cond0.end: +; CHECK-NEXT: [[TMP0:%.*]] = phi double [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[LARGEPHI_EXTRACTSLICE1]], [[COND0_TRUE]] ] +; CHECK-NEXT: [[TMP1:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[LARGEPHI_EXTRACTSLICE3]], [[COND0_TRUE]] ] +; CHECK-NEXT: [[TMP2:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[LARGEPHI_EXTRACTSLICE5]], [[COND0_TRUE]] ] +; CHECK-NEXT: [[TMP3:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[LARGEPHI_EXTRACTSLICE7]], [[COND0_TRUE]] ] +; CHECK-NEXT: [[TMP4:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[LARGEPHI_EXTRACTSLICE9]], [[COND0_TRUE]] ] +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE0:%.*]] = insertelement <5 x double> poison, double [[TMP0]], i64 0 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE1:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE0]], double [[TMP1]], i64 1 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE2:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE1]], double [[TMP2]], i64 2 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE3:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE2]], double [[TMP3]], i64 3 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE4:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE3]], double [[TMP4]], i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE0:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE2:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE4:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE6:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE8:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 4 +; CHECK-NEXT: br i1 [[COND]], label [[COND1_TRUE:%.*]], label [[COND1_END:%.*]] +; CHECK: cond1.true: +; CHECK-NEXT: [[Y:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE4]], double 6.140000e+00, i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE11:%.*]] = extractelement <5 x double> [[Y]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE32:%.*]] = extractelement <5 x double> [[Y]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE53:%.*]] = extractelement <5 x double> [[Y]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE74:%.*]] = extractelement <5 x double> [[Y]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE95:%.*]] = extractelement <5 x double> [[Y]], i64 4 +; CHECK-NEXT: br label [[COND1_END]] +; CHECK: cond1.end: +; CHECK-NEXT: [[TMP5:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE0]], [[COND0_END]] ], [ [[LARGEPHI_EXTRACTSLICE11]], [[COND1_TRUE]] ] +; CHECK-NEXT: [[TMP6:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE2]], [[COND0_END]] ], [ [[LARGEPHI_EXTRACTSLICE32]], [[COND1_TRUE]] ] +; CHECK-NEXT: [[TMP7:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE4]], [[COND0_END]] ], [ [[LARGEPHI_EXTRACTSLICE53]], [[COND1_TRUE]] ] +; CHECK-NEXT: [[TMP8:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE6]], [[COND0_END]] ], [ [[LARGEPHI_EXTRACTSLICE74]], [[COND1_TRUE]] ] +; CHECK-NEXT: [[TMP9:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE8]], [[COND0_END]] ], [ [[LARGEPHI_EXTRACTSLICE95]], [[COND1_TRUE]] ] +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE06:%.*]] = insertelement <5 x double> poison, double [[TMP5]], i64 0 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE17:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE06]], double [[TMP6]], i64 1 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE28:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE17]], double [[TMP7]], i64 2 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE39:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE28]], double [[TMP8]], i64 3 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE410:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE39]], double [[TMP9]], i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE011:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE410]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE213:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE410]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE415:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE410]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE617:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE410]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE819:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE410]], i64 4 +; CHECK-NEXT: br i1 [[COND]], label [[COND2_TRUE:%.*]], label [[COND2_END:%.*]] +; CHECK: cond2.true: +; CHECK-NEXT: [[Z:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE4]], double 6.140000e+00, i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE112:%.*]] = extractelement <5 x double> [[Z]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE314:%.*]] = extractelement <5 x double> [[Z]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE516:%.*]] = extractelement <5 x double> [[Z]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE718:%.*]] = extractelement <5 x double> [[Z]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE920:%.*]] = extractelement <5 x double> [[Z]], i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE127:%.*]] = extractelement <5 x double> [[Z]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE329:%.*]] = extractelement <5 x double> [[Z]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE531:%.*]] = extractelement <5 x double> [[Z]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE733:%.*]] = extractelement <5 x double> [[Z]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE935:%.*]] = extractelement <5 x double> [[Z]], i64 4 +; CHECK-NEXT: br i1 [[COND]], label [[COND2_END]], label [[END:%.*]] +; CHECK: cond2.end: +; CHECK-NEXT: [[TMP10:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE011]], [[COND1_END]] ], [ [[LARGEPHI_EXTRACTSLICE112]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[TMP11:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE213]], [[COND1_END]] ], [ [[LARGEPHI_EXTRACTSLICE314]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[TMP12:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE415]], [[COND1_END]] ], [ [[LARGEPHI_EXTRACTSLICE516]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[TMP13:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE617]], [[COND1_END]] ], [ [[LARGEPHI_EXTRACTSLICE718]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[TMP14:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE819]], [[COND1_END]] ], [ [[LARGEPHI_EXTRACTSLICE920]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE021:%.*]] = insertelement <5 x double> poison, double [[TMP10]], i64 0 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE122:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE021]], double [[TMP11]], i64 1 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE223:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE122]], double [[TMP12]], i64 2 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE324:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE223]], double [[TMP13]], i64 3 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE425:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE324]], double [[TMP14]], i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE026:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE425]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE228:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE425]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE430:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE425]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE632:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE425]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE834:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE425]], i64 4 +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: [[TMP15:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE026]], [[COND2_END]] ], [ [[LARGEPHI_EXTRACTSLICE127]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[TMP16:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE228]], [[COND2_END]] ], [ [[LARGEPHI_EXTRACTSLICE329]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[TMP17:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE430]], [[COND2_END]] ], [ [[LARGEPHI_EXTRACTSLICE531]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[TMP18:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE632]], [[COND2_END]] ], [ [[LARGEPHI_EXTRACTSLICE733]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[TMP19:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE834]], [[COND2_END]] ], [ [[LARGEPHI_EXTRACTSLICE935]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE036:%.*]] = insertelement <5 x double> poison, double [[TMP15]], i64 0 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE137:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE036]], double [[TMP16]], i64 1 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE238:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE137]], double [[TMP17]], i64 2 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE339:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE238]], double [[TMP18]], i64 3 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE440:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE339]], double [[TMP19]], i64 4 +; CHECK-NEXT: store <5 x double> [[LARGEPHI_INSERTSLICE440]], ptr [[OUT:%.*]], align 1 +; CHECK-NEXT: ret void +; +entry: + br i1 %cond, label %cond0.true, label %cond0.end + +cond0.true: + %x = insertelement <5 x double> %in, double 3.140000e+00, i64 3 + br label %cond0.end + +cond0.end: + %val.0 = phi <5 x double> [ zeroinitializer, %entry ], [ %x, %cond0.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond1.true, label %cond1.end + +cond1.true: + %y = insertelement <5 x double> %val.0, double 6.140000e+00, i64 2 + br label %cond1.end + +cond1.end: + %val.1 = phi <5 x double> [ %val.0, %cond0.end ], [ %y, %cond1.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond2.true, label %cond2.end + +cond2.true: + %z = insertelement <5 x double> %val.0, double 6.140000e+00, i64 2 + br i1 %cond, label %cond2.end, label %end + +cond2.end: + %val.2 = phi <5 x double> [ %val.1, %cond1.end ], [ %z, %cond2.true ], !amdgpu.breakablephi !0 + br label %end + +end: + %endval = phi <5 x double> [ %val.2, %cond2.end ], [ %z, %cond2.true ], !amdgpu.unbreakablephi !0 + store <5 x double> %endval, ptr %out, align 1 + ret void +} + +; 7 PHIS, 4 Breakable +define amdgpu_kernel void @test_breakable_chain_4_out_of_7(<5 x double> %in, ptr %out, i1 %cond) { +; CHECK-LABEL: @test_breakable_chain_4_out_of_7( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[COND:%.*]], label [[COND0_TRUE:%.*]], label [[COND0_END:%.*]] +; CHECK: cond0.true: +; CHECK-NEXT: [[X:%.*]] = insertelement <5 x double> [[IN:%.*]], double 3.140000e+00, i64 3 +; CHECK-NEXT: br label [[COND0_END]] +; CHECK: cond0.end: +; CHECK-NEXT: [[VAL_0:%.*]] = phi <5 x double> [ zeroinitializer, [[ENTRY:%.*]] ], [ [[X]], [[COND0_TRUE]] ], !amdgpu.breakablephi !0 +; CHECK-NEXT: br i1 [[COND]], label [[COND1_TRUE:%.*]], label [[COND1_END:%.*]] +; CHECK: cond1.true: +; CHECK-NEXT: [[Y:%.*]] = insertelement <5 x double> [[VAL_0]], double 6.140000e+00, i64 2 +; CHECK-NEXT: br label [[COND1_END]] +; CHECK: cond1.end: +; CHECK-NEXT: [[VAL_1:%.*]] = phi <5 x double> [ [[VAL_0]], [[COND0_END]] ], [ [[Y]], [[COND1_TRUE]] ], !amdgpu.breakablephi !0 +; CHECK-NEXT: br i1 [[COND]], label [[COND2_TRUE:%.*]], label [[COND2_END:%.*]] +; CHECK: cond2.true: +; CHECK-NEXT: [[Z:%.*]] = insertelement <5 x double> [[VAL_0]], double 6.140000e+00, i64 2 +; CHECK-NEXT: br label [[COND2_END]] +; CHECK: cond2.end: +; CHECK-NEXT: [[VAL_2:%.*]] = phi <5 x double> [ [[VAL_1]], [[COND1_END]] ], [ [[Z]], [[COND2_TRUE]] ], !amdgpu.breakablephi !0 +; CHECK-NEXT: br i1 [[COND]], label [[COND3_TRUE:%.*]], label [[COND3_END:%.*]] +; CHECK: cond3.true: +; CHECK-NEXT: [[A:%.*]] = insertelement <5 x double> [[VAL_0]], double 7.140000e+00, i64 4 +; CHECK-NEXT: br label [[COND3_END]] +; CHECK: cond3.end: +; CHECK-NEXT: [[VAL_3:%.*]] = phi <5 x double> [ [[VAL_2]], [[COND2_END]] ], [ [[A]], [[COND3_TRUE]] ], !amdgpu.breakablephi !0 +; CHECK-NEXT: br i1 [[COND]], label [[COND4_TRUE:%.*]], label [[COND4_END:%.*]] +; CHECK: cond4.true: +; CHECK-NEXT: [[B:%.*]] = insertelement <5 x double> [[VAL_0]], double 7.140000e+00, i64 4 +; CHECK-NEXT: br label [[COND4_END]] +; CHECK: cond4.end: +; CHECK-NEXT: [[VAL_4:%.*]] = phi <5 x double> [ [[VAL_3]], [[COND3_END]] ], [ [[B]], [[COND4_TRUE]] ], !amdgpu.unbreakablephi !0 +; CHECK-NEXT: br i1 [[COND]], label [[COND5_TRUE:%.*]], label [[COND5_END:%.*]] +; CHECK: cond5.true: +; CHECK-NEXT: [[C:%.*]] = insertelement <5 x double> [[VAL_0]], double 7.140000e+00, i64 4 +; CHECK-NEXT: br i1 [[COND]], label [[END:%.*]], label [[COND5_END]] +; CHECK: cond5.end: +; CHECK-NEXT: [[VAL_5:%.*]] = phi <5 x double> [ [[VAL_4]], [[COND4_END]] ], [ [[C]], [[COND5_TRUE]] ], !amdgpu.unbreakablephi !0 +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: [[ENDVAL:%.*]] = phi <5 x double> [ [[VAL_5]], [[COND5_END]] ], [ [[C]], [[COND5_TRUE]] ], !amdgpu.unbreakablephi !0 +; CHECK-NEXT: store <5 x double> [[ENDVAL]], ptr [[OUT:%.*]], align 1 +; CHECK-NEXT: ret void +; +entry: + br i1 %cond, label %cond0.true, label %cond0.end + +cond0.true: + %x = insertelement <5 x double> %in, double 3.140000e+00, i64 3 + br label %cond0.end + +cond0.end: + %val.0 = phi <5 x double> [ zeroinitializer, %entry ], [ %x, %cond0.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond1.true, label %cond1.end + +cond1.true: + %y = insertelement <5 x double> %val.0, double 6.140000e+00, i64 2 + br label %cond1.end + +cond1.end: + %val.1 = phi <5 x double> [ %val.0, %cond0.end ], [ %y, %cond1.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond2.true, label %cond2.end + +cond2.true: + %z = insertelement <5 x double> %val.0, double 6.140000e+00, i64 2 + br label %cond2.end + +cond2.end: + %val.2 = phi <5 x double> [ %val.1, %cond1.end ], [ %z, %cond2.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond3.true, label %cond3.end + +cond3.true: + %a = insertelement <5 x double> %val.0, double 7.140000e+00, i64 4 + br label %cond3.end + +cond3.end: + %val.3 = phi <5 x double> [ %val.2, %cond2.end ], [ %a, %cond3.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond4.true, label %cond4.end + +cond4.true: + %b = insertelement <5 x double> %val.0, double 7.140000e+00, i64 4 + br label %cond4.end + +cond4.end: + %val.4 = phi <5 x double> [ %val.3, %cond3.end ], [ %b, %cond4.true ], !amdgpu.unbreakablephi !0 + br i1 %cond, label %cond5.true, label %cond5.end + +cond5.true: + %c = insertelement <5 x double> %val.0, double 7.140000e+00, i64 4 + br i1 %cond, label %end, label %cond5.end + +cond5.end: + %val.5 = phi <5 x double> [ %val.4, %cond4.end ], [ %c, %cond5.true ], !amdgpu.unbreakablephi !0 + br label %end + +end: + %endval = phi <5 x double> [ %val.5, %cond5.end ], [ %c, %cond5.true ], !amdgpu.unbreakablephi !0 + store <5 x double> %endval, ptr %out, align 1 + ret void +} + +define amdgpu_kernel void @test_breakable_chain_5_out_of_7(<5 x double> %in, ptr %out, i1 %cond) { +; CHECK-LABEL: @test_breakable_chain_5_out_of_7( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 [[COND:%.*]], label [[COND0_TRUE:%.*]], label [[COND0_END:%.*]] +; CHECK: cond0.true: +; CHECK-NEXT: [[X:%.*]] = insertelement <5 x double> [[IN:%.*]], double 3.140000e+00, i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE1:%.*]] = extractelement <5 x double> [[X]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE3:%.*]] = extractelement <5 x double> [[X]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE5:%.*]] = extractelement <5 x double> [[X]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE7:%.*]] = extractelement <5 x double> [[X]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE9:%.*]] = extractelement <5 x double> [[X]], i64 4 +; CHECK-NEXT: br label [[COND0_END]] +; CHECK: cond0.end: +; CHECK-NEXT: [[TMP0:%.*]] = phi double [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[LARGEPHI_EXTRACTSLICE1]], [[COND0_TRUE]] ] +; CHECK-NEXT: [[TMP1:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[LARGEPHI_EXTRACTSLICE3]], [[COND0_TRUE]] ] +; CHECK-NEXT: [[TMP2:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[LARGEPHI_EXTRACTSLICE5]], [[COND0_TRUE]] ] +; CHECK-NEXT: [[TMP3:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[LARGEPHI_EXTRACTSLICE7]], [[COND0_TRUE]] ] +; CHECK-NEXT: [[TMP4:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[LARGEPHI_EXTRACTSLICE9]], [[COND0_TRUE]] ] +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE0:%.*]] = insertelement <5 x double> poison, double [[TMP0]], i64 0 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE1:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE0]], double [[TMP1]], i64 1 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE2:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE1]], double [[TMP2]], i64 2 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE3:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE2]], double [[TMP3]], i64 3 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE4:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE3]], double [[TMP4]], i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE0:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE2:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE4:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE6:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE8:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE4]], i64 4 +; CHECK-NEXT: br i1 [[COND]], label [[COND1_TRUE:%.*]], label [[COND1_END:%.*]] +; CHECK: cond1.true: +; CHECK-NEXT: [[Y:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE4]], double 6.140000e+00, i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE11:%.*]] = extractelement <5 x double> [[Y]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE32:%.*]] = extractelement <5 x double> [[Y]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE53:%.*]] = extractelement <5 x double> [[Y]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE74:%.*]] = extractelement <5 x double> [[Y]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE95:%.*]] = extractelement <5 x double> [[Y]], i64 4 +; CHECK-NEXT: br label [[COND1_END]] +; CHECK: cond1.end: +; CHECK-NEXT: [[TMP5:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE0]], [[COND0_END]] ], [ [[LARGEPHI_EXTRACTSLICE11]], [[COND1_TRUE]] ] +; CHECK-NEXT: [[TMP6:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE2]], [[COND0_END]] ], [ [[LARGEPHI_EXTRACTSLICE32]], [[COND1_TRUE]] ] +; CHECK-NEXT: [[TMP7:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE4]], [[COND0_END]] ], [ [[LARGEPHI_EXTRACTSLICE53]], [[COND1_TRUE]] ] +; CHECK-NEXT: [[TMP8:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE6]], [[COND0_END]] ], [ [[LARGEPHI_EXTRACTSLICE74]], [[COND1_TRUE]] ] +; CHECK-NEXT: [[TMP9:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE8]], [[COND0_END]] ], [ [[LARGEPHI_EXTRACTSLICE95]], [[COND1_TRUE]] ] +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE06:%.*]] = insertelement <5 x double> poison, double [[TMP5]], i64 0 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE17:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE06]], double [[TMP6]], i64 1 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE28:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE17]], double [[TMP7]], i64 2 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE39:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE28]], double [[TMP8]], i64 3 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE410:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE39]], double [[TMP9]], i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE011:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE410]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE213:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE410]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE415:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE410]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE617:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE410]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE819:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE410]], i64 4 +; CHECK-NEXT: br i1 [[COND]], label [[COND2_TRUE:%.*]], label [[COND2_END:%.*]] +; CHECK: cond2.true: +; CHECK-NEXT: [[Z:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE4]], double 6.140000e+00, i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE112:%.*]] = extractelement <5 x double> [[Z]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE314:%.*]] = extractelement <5 x double> [[Z]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE516:%.*]] = extractelement <5 x double> [[Z]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE718:%.*]] = extractelement <5 x double> [[Z]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE920:%.*]] = extractelement <5 x double> [[Z]], i64 4 +; CHECK-NEXT: br label [[COND2_END]] +; CHECK: cond2.end: +; CHECK-NEXT: [[TMP10:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE011]], [[COND1_END]] ], [ [[LARGEPHI_EXTRACTSLICE112]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[TMP11:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE213]], [[COND1_END]] ], [ [[LARGEPHI_EXTRACTSLICE314]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[TMP12:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE415]], [[COND1_END]] ], [ [[LARGEPHI_EXTRACTSLICE516]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[TMP13:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE617]], [[COND1_END]] ], [ [[LARGEPHI_EXTRACTSLICE718]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[TMP14:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE819]], [[COND1_END]] ], [ [[LARGEPHI_EXTRACTSLICE920]], [[COND2_TRUE]] ] +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE021:%.*]] = insertelement <5 x double> poison, double [[TMP10]], i64 0 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE122:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE021]], double [[TMP11]], i64 1 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE223:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE122]], double [[TMP12]], i64 2 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE324:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE223]], double [[TMP13]], i64 3 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE425:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE324]], double [[TMP14]], i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE026:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE425]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE228:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE425]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE430:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE425]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE632:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE425]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE834:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE425]], i64 4 +; CHECK-NEXT: br i1 [[COND]], label [[COND3_TRUE:%.*]], label [[COND3_END:%.*]] +; CHECK: cond3.true: +; CHECK-NEXT: [[A:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE4]], double 7.140000e+00, i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE127:%.*]] = extractelement <5 x double> [[A]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE329:%.*]] = extractelement <5 x double> [[A]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE531:%.*]] = extractelement <5 x double> [[A]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE733:%.*]] = extractelement <5 x double> [[A]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE935:%.*]] = extractelement <5 x double> [[A]], i64 4 +; CHECK-NEXT: br label [[COND3_END]] +; CHECK: cond3.end: +; CHECK-NEXT: [[TMP15:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE026]], [[COND2_END]] ], [ [[LARGEPHI_EXTRACTSLICE127]], [[COND3_TRUE]] ] +; CHECK-NEXT: [[TMP16:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE228]], [[COND2_END]] ], [ [[LARGEPHI_EXTRACTSLICE329]], [[COND3_TRUE]] ] +; CHECK-NEXT: [[TMP17:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE430]], [[COND2_END]] ], [ [[LARGEPHI_EXTRACTSLICE531]], [[COND3_TRUE]] ] +; CHECK-NEXT: [[TMP18:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE632]], [[COND2_END]] ], [ [[LARGEPHI_EXTRACTSLICE733]], [[COND3_TRUE]] ] +; CHECK-NEXT: [[TMP19:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE834]], [[COND2_END]] ], [ [[LARGEPHI_EXTRACTSLICE935]], [[COND3_TRUE]] ] +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE036:%.*]] = insertelement <5 x double> poison, double [[TMP15]], i64 0 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE137:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE036]], double [[TMP16]], i64 1 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE238:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE137]], double [[TMP17]], i64 2 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE339:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE238]], double [[TMP18]], i64 3 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE440:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE339]], double [[TMP19]], i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE041:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE440]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE243:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE440]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE445:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE440]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE647:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE440]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE849:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE440]], i64 4 +; CHECK-NEXT: br i1 [[COND]], label [[COND4_TRUE:%.*]], label [[COND4_END:%.*]] +; CHECK: cond4.true: +; CHECK-NEXT: [[B:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE4]], double 7.140000e+00, i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE142:%.*]] = extractelement <5 x double> [[B]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE344:%.*]] = extractelement <5 x double> [[B]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE546:%.*]] = extractelement <5 x double> [[B]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE748:%.*]] = extractelement <5 x double> [[B]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE950:%.*]] = extractelement <5 x double> [[B]], i64 4 +; CHECK-NEXT: br label [[COND4_END]] +; CHECK: cond4.end: +; CHECK-NEXT: [[TMP20:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE041]], [[COND3_END]] ], [ [[LARGEPHI_EXTRACTSLICE142]], [[COND4_TRUE]] ] +; CHECK-NEXT: [[TMP21:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE243]], [[COND3_END]] ], [ [[LARGEPHI_EXTRACTSLICE344]], [[COND4_TRUE]] ] +; CHECK-NEXT: [[TMP22:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE445]], [[COND3_END]] ], [ [[LARGEPHI_EXTRACTSLICE546]], [[COND4_TRUE]] ] +; CHECK-NEXT: [[TMP23:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE647]], [[COND3_END]] ], [ [[LARGEPHI_EXTRACTSLICE748]], [[COND4_TRUE]] ] +; CHECK-NEXT: [[TMP24:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE849]], [[COND3_END]] ], [ [[LARGEPHI_EXTRACTSLICE950]], [[COND4_TRUE]] ] +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE051:%.*]] = insertelement <5 x double> poison, double [[TMP20]], i64 0 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE152:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE051]], double [[TMP21]], i64 1 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE253:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE152]], double [[TMP22]], i64 2 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE354:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE253]], double [[TMP23]], i64 3 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE455:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE354]], double [[TMP24]], i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE056:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE455]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE258:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE455]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE460:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE455]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE662:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE455]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE864:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE455]], i64 4 +; CHECK-NEXT: br i1 [[COND]], label [[COND5_TRUE:%.*]], label [[COND5_END:%.*]] +; CHECK: cond5.true: +; CHECK-NEXT: [[C:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE4]], double 7.140000e+00, i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE157:%.*]] = extractelement <5 x double> [[C]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE359:%.*]] = extractelement <5 x double> [[C]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE561:%.*]] = extractelement <5 x double> [[C]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE763:%.*]] = extractelement <5 x double> [[C]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE965:%.*]] = extractelement <5 x double> [[C]], i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE172:%.*]] = extractelement <5 x double> [[C]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE374:%.*]] = extractelement <5 x double> [[C]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE576:%.*]] = extractelement <5 x double> [[C]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE778:%.*]] = extractelement <5 x double> [[C]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE980:%.*]] = extractelement <5 x double> [[C]], i64 4 +; CHECK-NEXT: br i1 [[COND]], label [[END:%.*]], label [[COND5_END]] +; CHECK: cond5.end: +; CHECK-NEXT: [[TMP25:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE056]], [[COND4_END]] ], [ [[LARGEPHI_EXTRACTSLICE157]], [[COND5_TRUE]] ] +; CHECK-NEXT: [[TMP26:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE258]], [[COND4_END]] ], [ [[LARGEPHI_EXTRACTSLICE359]], [[COND5_TRUE]] ] +; CHECK-NEXT: [[TMP27:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE460]], [[COND4_END]] ], [ [[LARGEPHI_EXTRACTSLICE561]], [[COND5_TRUE]] ] +; CHECK-NEXT: [[TMP28:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE662]], [[COND4_END]] ], [ [[LARGEPHI_EXTRACTSLICE763]], [[COND5_TRUE]] ] +; CHECK-NEXT: [[TMP29:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE864]], [[COND4_END]] ], [ [[LARGEPHI_EXTRACTSLICE965]], [[COND5_TRUE]] ] +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE066:%.*]] = insertelement <5 x double> poison, double [[TMP25]], i64 0 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE167:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE066]], double [[TMP26]], i64 1 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE268:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE167]], double [[TMP27]], i64 2 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE369:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE268]], double [[TMP28]], i64 3 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE470:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE369]], double [[TMP29]], i64 4 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE071:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE470]], i64 0 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE273:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE470]], i64 1 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE475:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE470]], i64 2 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE677:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE470]], i64 3 +; CHECK-NEXT: [[LARGEPHI_EXTRACTSLICE879:%.*]] = extractelement <5 x double> [[LARGEPHI_INSERTSLICE470]], i64 4 +; CHECK-NEXT: br label [[END]] +; CHECK: end: +; CHECK-NEXT: [[TMP30:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE071]], [[COND5_END]] ], [ [[LARGEPHI_EXTRACTSLICE172]], [[COND5_TRUE]] ] +; CHECK-NEXT: [[TMP31:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE273]], [[COND5_END]] ], [ [[LARGEPHI_EXTRACTSLICE374]], [[COND5_TRUE]] ] +; CHECK-NEXT: [[TMP32:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE475]], [[COND5_END]] ], [ [[LARGEPHI_EXTRACTSLICE576]], [[COND5_TRUE]] ] +; CHECK-NEXT: [[TMP33:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE677]], [[COND5_END]] ], [ [[LARGEPHI_EXTRACTSLICE778]], [[COND5_TRUE]] ] +; CHECK-NEXT: [[TMP34:%.*]] = phi double [ [[LARGEPHI_EXTRACTSLICE879]], [[COND5_END]] ], [ [[LARGEPHI_EXTRACTSLICE980]], [[COND5_TRUE]] ] +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE081:%.*]] = insertelement <5 x double> poison, double [[TMP30]], i64 0 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE182:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE081]], double [[TMP31]], i64 1 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE283:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE182]], double [[TMP32]], i64 2 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE384:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE283]], double [[TMP33]], i64 3 +; CHECK-NEXT: [[LARGEPHI_INSERTSLICE485:%.*]] = insertelement <5 x double> [[LARGEPHI_INSERTSLICE384]], double [[TMP34]], i64 4 +; CHECK-NEXT: store <5 x double> [[LARGEPHI_INSERTSLICE485]], ptr [[OUT:%.*]], align 1 +; CHECK-NEXT: ret void +; +entry: + br i1 %cond, label %cond0.true, label %cond0.end + +cond0.true: + %x = insertelement <5 x double> %in, double 3.140000e+00, i64 3 + br label %cond0.end + +cond0.end: + %val.0 = phi <5 x double> [ zeroinitializer, %entry ], [ %x, %cond0.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond1.true, label %cond1.end + +cond1.true: + %y = insertelement <5 x double> %val.0, double 6.140000e+00, i64 2 + br label %cond1.end + +cond1.end: + %val.1 = phi <5 x double> [ %val.0, %cond0.end ], [ %y, %cond1.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond2.true, label %cond2.end + +cond2.true: + %z = insertelement <5 x double> %val.0, double 6.140000e+00, i64 2 + br label %cond2.end + +cond2.end: + %val.2 = phi <5 x double> [ %val.1, %cond1.end ], [ %z, %cond2.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond3.true, label %cond3.end + +cond3.true: + %a = insertelement <5 x double> %val.0, double 7.140000e+00, i64 4 + br label %cond3.end + +cond3.end: + %val.3 = phi <5 x double> [ %val.2, %cond2.end ], [ %a, %cond3.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond4.true, label %cond4.end + +cond4.true: + %b = insertelement <5 x double> %val.0, double 7.140000e+00, i64 4 + br label %cond4.end + +cond4.end: + %val.4 = phi <5 x double> [ %val.3, %cond3.end ], [ %b, %cond4.true ], !amdgpu.breakablephi !0 + br i1 %cond, label %cond5.true, label %cond5.end + +cond5.true: + %c = insertelement <5 x double> %val.0, double 7.140000e+00, i64 4 + br i1 %cond, label %end, label %cond5.end + +cond5.end: + %val.5 = phi <5 x double> [ %val.4, %cond4.end ], [ %c, %cond5.true ], !amdgpu.unbreakablephi !0 + br label %end + +end: + %endval = phi <5 x double> [ %val.5, %cond5.end ], [ %c, %cond5.true ], !amdgpu.unbreakablephi !0 + store <5 x double> %endval, ptr %out, align 1 + ret void +} + +!0 = !{}