1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -licm < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt -passes='require<aa>,require<targetir>,require<scalar-evolution>,loop(licm)' -S %s | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; UDiv is safe to speculate if the denominator is known non-zero. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @safe_udiv( 7*9880d681SAndroid Build Coastguard Worker; CHECK: %div = udiv i64 %x, 2 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %for.body 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdefine void @safe_udiv(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind { 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker br label %for.body 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.inc 15*9880d681SAndroid Build Coastguard Worker %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ] 16*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02 17*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 18*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %0, 0 19*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %for.inc, label %if.then 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %for.body 22*9880d681SAndroid Build Coastguard Worker %div = udiv i64 %x, 2 23*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02 24*9880d681SAndroid Build Coastguard Worker store i64 %div, i64* %arrayidx1, align 8 25*9880d681SAndroid Build Coastguard Worker br label %for.inc 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerfor.inc: ; preds = %if.then, %for.body 28*9880d681SAndroid Build Coastguard Worker %inc = add i64 %i.02, 1 29*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i64 %inc, %n 30*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.inc, %entry 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; UDiv is unsafe to speculate if the denominator is not known non-zero. 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unsafe_udiv( 39*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: udiv 40*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_udiv(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker br label %for.body 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.inc 47*9880d681SAndroid Build Coastguard Worker %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ] 48*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02 49*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 50*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %0, 0 51*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %for.inc, label %if.then 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %for.body 54*9880d681SAndroid Build Coastguard Worker %div = udiv i64 %x, %m 55*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02 56*9880d681SAndroid Build Coastguard Worker store i64 %div, i64* %arrayidx1, align 8 57*9880d681SAndroid Build Coastguard Worker br label %for.inc 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerfor.inc: ; preds = %if.then, %for.body 60*9880d681SAndroid Build Coastguard Worker %inc = add i64 %i.02, 1 61*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i64 %inc, %n 62*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.inc, %entry 65*9880d681SAndroid Build Coastguard Worker ret void 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; SDiv is safe to speculate if the denominator is known non-zero and 69*9880d681SAndroid Build Coastguard Worker; known to have at least one zero bit. 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @safe_sdiv( 72*9880d681SAndroid Build Coastguard Worker; CHECK: %div = sdiv i64 %x, 2 73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %for.body 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine void @safe_sdiv(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind { 76*9880d681SAndroid Build Coastguard Workerentry: 77*9880d681SAndroid Build Coastguard Worker %and = and i64 %m, -3 78*9880d681SAndroid Build Coastguard Worker br label %for.body 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.inc 81*9880d681SAndroid Build Coastguard Worker %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ] 82*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02 83*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 84*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %0, 0 85*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %for.inc, label %if.then 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %for.body 88*9880d681SAndroid Build Coastguard Worker %div = sdiv i64 %x, 2 89*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02 90*9880d681SAndroid Build Coastguard Worker store i64 %div, i64* %arrayidx1, align 8 91*9880d681SAndroid Build Coastguard Worker br label %for.inc 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerfor.inc: ; preds = %if.then, %for.body 94*9880d681SAndroid Build Coastguard Worker %inc = add i64 %i.02, 1 95*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i64 %inc, %n 96*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.inc, %entry 99*9880d681SAndroid Build Coastguard Worker ret void 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; SDiv is unsafe to speculate if the denominator is not known non-zero. 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unsafe_sdiv_a( 105*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sdiv 106*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_sdiv_a(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind { 109*9880d681SAndroid Build Coastguard Workerentry: 110*9880d681SAndroid Build Coastguard Worker %or = or i64 %m, 1 111*9880d681SAndroid Build Coastguard Worker br label %for.body 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.inc 114*9880d681SAndroid Build Coastguard Worker %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ] 115*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02 116*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 117*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %0, 0 118*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %for.inc, label %if.then 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %for.body 121*9880d681SAndroid Build Coastguard Worker %div = sdiv i64 %x, %or 122*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02 123*9880d681SAndroid Build Coastguard Worker store i64 %div, i64* %arrayidx1, align 8 124*9880d681SAndroid Build Coastguard Worker br label %for.inc 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerfor.inc: ; preds = %if.then, %for.body 127*9880d681SAndroid Build Coastguard Worker %inc = add i64 %i.02, 1 128*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i64 %inc, %n 129*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.inc, %entry 132*9880d681SAndroid Build Coastguard Worker ret void 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker; SDiv is unsafe to speculate if the denominator is not known to have a zero bit. 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unsafe_sdiv_b( 138*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sdiv 139*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_sdiv_b(i64 %x, i64 %m, i64 %n, i32* %p, i64* %q) nounwind { 142*9880d681SAndroid Build Coastguard Workerentry: 143*9880d681SAndroid Build Coastguard Worker %and = and i64 %m, -3 144*9880d681SAndroid Build Coastguard Worker br label %for.body 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.inc 147*9880d681SAndroid Build Coastguard Worker %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ] 148*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %p, i64 %i.02 149*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 150*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %0, 0 151*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %for.inc, label %if.then 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %for.body 154*9880d681SAndroid Build Coastguard Worker %div = sdiv i64 %x, %and 155*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i64, i64* %q, i64 %i.02 156*9880d681SAndroid Build Coastguard Worker store i64 %div, i64* %arrayidx1, align 8 157*9880d681SAndroid Build Coastguard Worker br label %for.inc 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerfor.inc: ; preds = %if.then, %for.body 160*9880d681SAndroid Build Coastguard Worker %inc = add i64 %i.02, 1 161*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i64 %inc, %n 162*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.inc, %entry 165*9880d681SAndroid Build Coastguard Worker ret void 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; SDiv is unsafe to speculate inside an infinite loop. 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_sdiv_c(i64 %a, i64 %b, i64* %p) { 171*9880d681SAndroid Build Coastguard Workerentry: 172*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 173*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sdiv 174*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body 175*9880d681SAndroid Build Coastguard Worker br label %for.body 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerfor.body: 178*9880d681SAndroid Build Coastguard Worker %c = icmp eq i64 %b, 0 179*9880d681SAndroid Build Coastguard Worker br i1 %c, label %backedge, label %if.then 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerif.then: 182*9880d681SAndroid Build Coastguard Worker %d = sdiv i64 %a, %b 183*9880d681SAndroid Build Coastguard Worker store i64 %d, i64* %p 184*9880d681SAndroid Build Coastguard Worker br label %backedge 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Workerbackedge: 187*9880d681SAndroid Build Coastguard Worker br label %for.body 188*9880d681SAndroid Build Coastguard Worker} 189