1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-regalloc -verify-machineinstrs < %s 2*9880d681SAndroid Build Coastguard Worker; PR27275: When enabling remat for vreg defined by PHIs, make sure the update 3*9880d681SAndroid Build Coastguard Worker; of the live range removes dead phi. Otherwise, we may end up with PHIs with 4*9880d681SAndroid Build Coastguard Worker; incorrect operands and that will trigger assertions or verifier failures 5*9880d681SAndroid Build Coastguard Worker; in later passes. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128" 8*9880d681SAndroid Build Coastguard Workertarget triple = "i386-unknown-linux-gnu" 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker@b = external global i64, align 8 11*9880d681SAndroid Build Coastguard Worker@d = external global i32, align 4 12*9880d681SAndroid Build Coastguard Worker@e = external global i64, align 8 13*9880d681SAndroid Build Coastguard Worker@h = external global i16, align 2 14*9880d681SAndroid Build Coastguard Worker@a = external global i8, align 1 15*9880d681SAndroid Build Coastguard Worker@g = external global i64, align 8 16*9880d681SAndroid Build Coastguard Worker@j = external global i32, align 4 17*9880d681SAndroid Build Coastguard Worker@f = external global i16, align 2 18*9880d681SAndroid Build Coastguard Worker@.str = external unnamed_addr constant [12 x i8], align 1 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine void @fn1() { 21*9880d681SAndroid Build Coastguard Workerentry: 22*9880d681SAndroid Build Coastguard Worker %tmp = load i64, i64* @b, align 8 23*9880d681SAndroid Build Coastguard Worker %or = or i64 0, 3299921317 24*9880d681SAndroid Build Coastguard Worker %and = and i64 %or, %tmp 25*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* @d, align 4 26*9880d681SAndroid Build Coastguard Worker br i1 undef, label %lor.rhs, label %lor.end 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerlor.rhs: ; preds = %entry 29*9880d681SAndroid Build Coastguard Worker %tobool3 = icmp ne i8 undef, 0 30*9880d681SAndroid Build Coastguard Worker br label %lor.end 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerlor.end: ; preds = %lor.rhs, %entry 33*9880d681SAndroid Build Coastguard Worker %lor.ext = zext i1 undef to i32 34*9880d681SAndroid Build Coastguard Worker %tmp2 = load i64, i64* @e, align 8 35*9880d681SAndroid Build Coastguard Worker br i1 undef, label %lor.rhs5, label %lor.end7 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerlor.rhs5: ; preds = %lor.end 38*9880d681SAndroid Build Coastguard Worker br label %lor.end7 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerlor.end7: ; preds = %lor.rhs5, %lor.end 41*9880d681SAndroid Build Coastguard Worker %tmp3 = phi i1 [ true, %lor.end ], [ false, %lor.rhs5 ] 42*9880d681SAndroid Build Coastguard Worker %neg13 = xor i64 %tmp, -1 43*9880d681SAndroid Build Coastguard Worker %conv25 = zext i1 %tmp3 to i32 44*9880d681SAndroid Build Coastguard Worker %tobool46 = icmp eq i64 %tmp, 0 45*9880d681SAndroid Build Coastguard Worker %.pre = load i16, i16* @h, align 2 46*9880d681SAndroid Build Coastguard Worker %tobool10 = icmp eq i16 %.pre, 0 47*9880d681SAndroid Build Coastguard Worker %neg.us = xor i32 %tmp1, -1 48*9880d681SAndroid Build Coastguard Worker %conv12.us = sext i32 %neg.us to i64 49*9880d681SAndroid Build Coastguard Worker %tobool23.us = icmp eq i64 %tmp2, %and 50*9880d681SAndroid Build Coastguard Worker %conv39.us = sext i32 %tmp1 to i64 51*9880d681SAndroid Build Coastguard Worker br label %LABEL_mSmSDb 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard WorkerLABEL_mSmSDb.loopexit: ; preds = %lor.end32.us 54*9880d681SAndroid Build Coastguard Worker %conv42.us.lcssa = phi i32 [ %conv42.us, %lor.end32.us ] 55*9880d681SAndroid Build Coastguard Worker store i64 undef, i64* @g, align 8 56*9880d681SAndroid Build Coastguard Worker br label %LABEL_mSmSDb 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard WorkerLABEL_mSmSDb: ; preds = %LABEL_mSmSDb.loopexit, %lor.end7 59*9880d681SAndroid Build Coastguard Worker %tmp4 = phi i32 [ undef, %lor.end7 ], [ %conv42.us.lcssa, %LABEL_mSmSDb.loopexit ] 60*9880d681SAndroid Build Coastguard Worker %tmp5 = phi i64 [ %tmp, %lor.end7 ], [ 0, %LABEL_mSmSDb.loopexit ] 61*9880d681SAndroid Build Coastguard Worker br i1 %tobool10, label %LABEL_BRBRN.preheader, label %if.then 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %LABEL_mSmSDb 64*9880d681SAndroid Build Coastguard Worker store i8 undef, i8* @a, align 1 65*9880d681SAndroid Build Coastguard Worker br label %LABEL_BRBRN.preheader 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard WorkerLABEL_BRBRN.preheader: ; preds = %if.then, %LABEL_mSmSDb 68*9880d681SAndroid Build Coastguard Worker %.pre63 = load i64, i64* @g, align 8 69*9880d681SAndroid Build Coastguard Worker br i1 %tobool46, label %LABEL_BRBRN.us, label %LABEL_BRBRN.outer 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard WorkerLABEL_BRBRN.outer: ; preds = %if.then47, %LABEL_BRBRN.preheader 72*9880d681SAndroid Build Coastguard Worker %.ph = phi i32 [ 0, %if.then47 ], [ %tmp4, %LABEL_BRBRN.preheader ] 73*9880d681SAndroid Build Coastguard Worker %.ph64 = phi i32 [ %conv50, %if.then47 ], [ %tmp1, %LABEL_BRBRN.preheader ] 74*9880d681SAndroid Build Coastguard Worker %.ph65 = phi i64 [ %tmp16, %if.then47 ], [ %.pre63, %LABEL_BRBRN.preheader ] 75*9880d681SAndroid Build Coastguard Worker %.ph66 = phi i64 [ 0, %if.then47 ], [ %tmp2, %LABEL_BRBRN.preheader ] 76*9880d681SAndroid Build Coastguard Worker %.ph67 = phi i64 [ %.pre56.pre, %if.then47 ], [ %tmp5, %LABEL_BRBRN.preheader ] 77*9880d681SAndroid Build Coastguard Worker %neg = xor i32 %.ph64, -1 78*9880d681SAndroid Build Coastguard Worker %conv12 = sext i32 %neg to i64 79*9880d681SAndroid Build Coastguard Worker %tobool23 = icmp eq i64 %.ph66, %and 80*9880d681SAndroid Build Coastguard Worker %tmp6 = load i32, i32* @j, align 4 81*9880d681SAndroid Build Coastguard Worker %shr = lshr i32 %conv25, %tmp6 82*9880d681SAndroid Build Coastguard Worker %conv39 = sext i32 %.ph64 to i64 83*9880d681SAndroid Build Coastguard Worker br label %LABEL_BRBRN 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard WorkerLABEL_BRBRN.us: ; preds = %lor.end32.us, %LABEL_BRBRN.preheader 86*9880d681SAndroid Build Coastguard Worker %tmp7 = phi i32 [ %conv42.us, %lor.end32.us ], [ %tmp4, %LABEL_BRBRN.preheader ] 87*9880d681SAndroid Build Coastguard Worker %tmp8 = phi i64 [ undef, %lor.end32.us ], [ %.pre63, %LABEL_BRBRN.preheader ] 88*9880d681SAndroid Build Coastguard Worker %tmp9 = phi i64 [ %tmp10, %lor.end32.us ], [ %tmp5, %LABEL_BRBRN.preheader ] 89*9880d681SAndroid Build Coastguard Worker %mul.us = mul i64 %tmp8, %neg13 90*9880d681SAndroid Build Coastguard Worker %mul14.us = mul i64 %mul.us, %conv12.us 91*9880d681SAndroid Build Coastguard Worker %cmp.us = icmp sgt i64 %tmp2, %mul14.us 92*9880d681SAndroid Build Coastguard Worker %conv16.us = zext i1 %cmp.us to i64 93*9880d681SAndroid Build Coastguard Worker %xor.us = xor i64 %conv16.us, %tmp9 94*9880d681SAndroid Build Coastguard Worker %rem18.us = urem i32 %lor.ext, %tmp7 95*9880d681SAndroid Build Coastguard Worker %conv19.us = zext i32 %rem18.us to i64 96*9880d681SAndroid Build Coastguard Worker br i1 %tobool23.us, label %lor.rhs24.us, label %lor.end32.us 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerlor.rhs24.us: ; preds = %LABEL_BRBRN.us 99*9880d681SAndroid Build Coastguard Worker br label %lor.end32.us 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerlor.end32.us: ; preds = %lor.rhs24.us, %LABEL_BRBRN.us 102*9880d681SAndroid Build Coastguard Worker %tmp10 = phi i64 [ -2, %LABEL_BRBRN.us ], [ -1, %lor.rhs24.us ] 103*9880d681SAndroid Build Coastguard Worker %xor.us.not = xor i64 %xor.us, -1 104*9880d681SAndroid Build Coastguard Worker %neg36.us = and i64 %conv19.us, %xor.us.not 105*9880d681SAndroid Build Coastguard Worker %conv37.us = zext i32 %tmp7 to i64 106*9880d681SAndroid Build Coastguard Worker %sub38.us = sub nsw i64 %neg36.us, %conv37.us 107*9880d681SAndroid Build Coastguard Worker %mul40.us = mul nsw i64 %sub38.us, %conv39.us 108*9880d681SAndroid Build Coastguard Worker %neg41.us = xor i64 %mul40.us, 4294967295 109*9880d681SAndroid Build Coastguard Worker %conv42.us = trunc i64 %neg41.us to i32 110*9880d681SAndroid Build Coastguard Worker %tobool43.us = icmp eq i8 undef, 0 111*9880d681SAndroid Build Coastguard Worker br i1 %tobool43.us, label %LABEL_mSmSDb.loopexit, label %LABEL_BRBRN.us 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard WorkerLABEL_BRBRN: ; preds = %lor.end32, %LABEL_BRBRN.outer 114*9880d681SAndroid Build Coastguard Worker %tmp11 = phi i32 [ %conv42, %lor.end32 ], [ %.ph, %LABEL_BRBRN.outer ] 115*9880d681SAndroid Build Coastguard Worker %tmp12 = phi i64 [ %neg21, %lor.end32 ], [ %.ph65, %LABEL_BRBRN.outer ] 116*9880d681SAndroid Build Coastguard Worker %tmp13 = phi i64 [ %conv35, %lor.end32 ], [ %.ph67, %LABEL_BRBRN.outer ] 117*9880d681SAndroid Build Coastguard Worker %mul = mul i64 %tmp12, %neg13 118*9880d681SAndroid Build Coastguard Worker %mul14 = mul i64 %mul, %conv12 119*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i64 %.ph66, %mul14 120*9880d681SAndroid Build Coastguard Worker %conv16 = zext i1 %cmp to i64 121*9880d681SAndroid Build Coastguard Worker %xor = xor i64 %conv16, %tmp13 122*9880d681SAndroid Build Coastguard Worker %rem18 = urem i32 %lor.ext, %tmp11 123*9880d681SAndroid Build Coastguard Worker %conv19 = zext i32 %rem18 to i64 124*9880d681SAndroid Build Coastguard Worker %neg21 = or i64 %xor, undef 125*9880d681SAndroid Build Coastguard Worker br i1 %tobool23, label %lor.rhs24, label %lor.end32 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerlor.rhs24: ; preds = %LABEL_BRBRN 128*9880d681SAndroid Build Coastguard Worker %tmp14 = load volatile i16, i16* @f, align 2 129*9880d681SAndroid Build Coastguard Worker %conv26 = sext i16 %tmp14 to i32 130*9880d681SAndroid Build Coastguard Worker %and27 = and i32 %conv26, %shr 131*9880d681SAndroid Build Coastguard Worker %conv28 = sext i32 %and27 to i64 132*9880d681SAndroid Build Coastguard Worker %mul29 = mul nsw i64 %conv28, %tmp 133*9880d681SAndroid Build Coastguard Worker %and30 = and i64 %mul29, %tmp13 134*9880d681SAndroid Build Coastguard Worker %tobool31 = icmp ne i64 %and30, 0 135*9880d681SAndroid Build Coastguard Worker br label %lor.end32 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerlor.end32: ; preds = %lor.rhs24, %LABEL_BRBRN 138*9880d681SAndroid Build Coastguard Worker %tmp15 = phi i1 [ true, %LABEL_BRBRN ], [ %tobool31, %lor.rhs24 ] 139*9880d681SAndroid Build Coastguard Worker %lor.ext33 = zext i1 %tmp15 to i32 140*9880d681SAndroid Build Coastguard Worker %neg34 = xor i32 %lor.ext33, -1 141*9880d681SAndroid Build Coastguard Worker %conv35 = sext i32 %neg34 to i64 142*9880d681SAndroid Build Coastguard Worker %xor.not = xor i64 %xor, -1 143*9880d681SAndroid Build Coastguard Worker %neg36 = and i64 %conv19, %xor.not 144*9880d681SAndroid Build Coastguard Worker %conv37 = zext i32 %tmp11 to i64 145*9880d681SAndroid Build Coastguard Worker %sub38 = sub nsw i64 %neg36, %conv37 146*9880d681SAndroid Build Coastguard Worker %mul40 = mul nsw i64 %sub38, %conv39 147*9880d681SAndroid Build Coastguard Worker %neg41 = xor i64 %mul40, 4294967295 148*9880d681SAndroid Build Coastguard Worker %conv42 = trunc i64 %neg41 to i32 149*9880d681SAndroid Build Coastguard Worker %tobool43 = icmp eq i8 undef, 0 150*9880d681SAndroid Build Coastguard Worker br i1 %tobool43, label %if.then47, label %LABEL_BRBRN 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerif.then47: ; preds = %lor.end32 153*9880d681SAndroid Build Coastguard Worker tail call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i32 0, i32 0), i64 %conv39) 154*9880d681SAndroid Build Coastguard Worker %tmp16 = load i64, i64* @g, align 8 155*9880d681SAndroid Build Coastguard Worker %neg49 = xor i64 %tmp16, 4294967295 156*9880d681SAndroid Build Coastguard Worker %conv50 = trunc i64 %neg49 to i32 157*9880d681SAndroid Build Coastguard Worker %.pre56.pre = load i64, i64* @b, align 8 158*9880d681SAndroid Build Coastguard Worker br label %LABEL_BRBRN.outer 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerdeclare void @printf(i8* nocapture readonly, ...) 162