;RUN: llc -march=hexagon -mv71t -O2 < %s -o - 2>&1 > /dev/null ; Validate that we do not crash while running this test. ;%3:intregs = PHI %21:intregs, %bb.6, %7:intregs, %bb.1 - SU0 ;%7:intregs = PHI %21:intregs, %bb.6, %13:intregs, %bb.1 - SU1 ;%27:intregs = A2_zxtb %3:intregs - SU2 ;%13:intregs = C2_muxri %45:predregs, 0, %46:intreg ;If we have dependent phis, SU0 should be the successor of SU1 not ;the other way around. (it used to be SU1 is the successor of SU0). ;In some cases, SU0 is scheduled earlier than SU1 resulting in bad ;IR as we do not have a value that can be used by SU2. @global = common dso_local local_unnamed_addr global ptr null, align 4 @global.1 = common dso_local local_unnamed_addr global i32 0, align 4 @global.2 = common dso_local local_unnamed_addr global i16 0, align 2 @global.3 = common dso_local local_unnamed_addr global i16 0, align 2 @global.4 = common dso_local local_unnamed_addr global i32 0, align 4 ; Function Attrs: nofree norecurse nosync nounwind define dso_local i16 @wombat(i8 zeroext %arg, i16 %dummy) local_unnamed_addr #0 { bb: %load = load ptr, ptr @global, align 4 %load1 = load i32, ptr @global.1, align 4 %add2 = add nsw i32 %load1, -1 store i32 %add2, ptr @global.1, align 4 %icmp = icmp eq i32 %load1, 0 br i1 %icmp, label %bb36, label %bb3 bb3: ; preds = %bb3, %bb %phi = phi i32 [ %add30, %bb3 ], [ %add2, %bb ] %phi4 = phi i8 [ %phi8, %bb3 ], [ %arg, %bb ] %phi5 = phi i16 [ %select23, %bb3 ], [ %dummy, %bb ] %phi6 = phi i16 [ %select26, %bb3 ], [ %dummy, %bb ] %phi7 = phi i16 [ %select, %bb3 ], [ %dummy, %bb ] %phi8 = phi i8 [ %select29, %bb3 ], [ %arg, %bb ] %zext = zext i8 %phi4 to i32 %getelementptr = getelementptr inbounds i32, ptr %load, i32 %zext %getelementptr9 = getelementptr inbounds i32, ptr %getelementptr, i32 2 %ptrtoint = ptrtoint ptr %getelementptr9 to i32 %trunc = trunc i32 %ptrtoint to i16 %sext10 = sext i16 %phi7 to i32 %shl11 = shl i32 %ptrtoint, 16 %ashr = ashr exact i32 %shl11, 16 %icmp12 = icmp slt i32 %ashr, %sext10 %select = select i1 %icmp12, i16 %trunc, i16 %phi7 %getelementptr13 = getelementptr inbounds i32, ptr %getelementptr, i32 3 %load14 = load i32, ptr %getelementptr13, align 4 %shl = shl i32 %load14, 8 %getelementptr15 = getelementptr inbounds i32, ptr %getelementptr, i32 1 %load16 = load i32, ptr %getelementptr15, align 4 %shl17 = shl i32 %load16, 16 %ashr18 = ashr exact i32 %shl17, 16 %add = add nsw i32 %ashr18, %load14 %lshr = lshr i32 %add, 8 %or = or i32 %lshr, %shl %sub = sub i32 %or, %load16 %trunc19 = trunc i32 %sub to i16 %sext = sext i16 %phi5 to i32 %shl20 = shl i32 %sub, 16 %ashr21 = ashr exact i32 %shl20, 16 %icmp22 = icmp sgt i32 %ashr21, %sext %select23 = select i1 %icmp22, i16 %trunc19, i16 %phi5 %sext24 = sext i16 %phi6 to i32 %icmp25 = icmp slt i32 %ashr21, %sext24 %select26 = select i1 %icmp25, i16 %trunc19, i16 %phi6 %icmp27 = icmp eq i8 %phi8, 0 %add28 = add i8 %phi8, -1 %select29 = select i1 %icmp27, i8 0, i8 %add28 %add30 = add nsw i32 %phi, -1 %icmp31 = icmp eq i32 %phi, 0 br i1 %icmp31, label %bb32, label %bb3 bb32: ; preds = %bb3 store i16 %trunc, ptr @global.2, align 2 store i16 %trunc19, ptr @global.3, align 2 store i32 -1, ptr @global.1, align 4 %sext33 = sext i16 %select to i32 %sext34 = sext i16 %select23 to i32 %sext35 = sext i16 %select26 to i32 br label %bb36 bb36: ; preds = %bb32, %bb %phi37 = phi i32 [ %sext33, %bb32 ], [ 0, %bb ] %phi38 = phi i32 [ %sext35, %bb32 ], [ 0, %bb ] %phi39 = phi i32 [ %sext34, %bb32 ], [ 0, %bb ] %sub40 = sub nsw i32 %phi39, %phi38 %icmp41 = icmp slt i32 %sub40, %phi37 br i1 %icmp41, label %bb43, label %bb42 bb42: ; preds = %bb36 store i32 0, ptr @global.4, align 4 br label %bb43 bb43: ; preds = %bb42, %bb36 ret i16 %dummy }