189 lines · plain
1; RUN: opt -S -passes=licm < %s | FileCheck %s2; RUN: opt -passes='require<aa>,require<target-ir>,require<scalar-evolution>,require<opt-remark-emit>,loop-mssa(licm)' -S %s | FileCheck %s3 4; UDiv is safe to speculate if the denominator is known non-zero.5 6; CHECK-LABEL: @safe_udiv(7; CHECK: %div = udiv i64 %x, 28; CHECK-NEXT: br label %for.body9 10define void @safe_udiv(i64 %x, i64 %m, i64 %n, ptr %p, ptr %q) nounwind {11entry:12 br label %for.body13 14for.body: ; preds = %entry, %for.inc15 %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]16 %arrayidx = getelementptr inbounds i32, ptr %p, i64 %i.0217 %0 = load i32, ptr %arrayidx, align 418 %tobool = icmp eq i32 %0, 019 br i1 %tobool, label %for.inc, label %if.then20 21if.then: ; preds = %for.body22 %div = udiv i64 %x, 223 %arrayidx1 = getelementptr inbounds i64, ptr %q, i64 %i.0224 store i64 %div, ptr %arrayidx1, align 825 br label %for.inc26 27for.inc: ; preds = %if.then, %for.body28 %inc = add i64 %i.02, 129 %cmp = icmp slt i64 %inc, %n30 br i1 %cmp, label %for.body, label %for.end31 32for.end: ; preds = %for.inc, %entry33 ret void34}35 36; UDiv is unsafe to speculate if the denominator is not known non-zero.37 38; CHECK-LABEL: @unsafe_udiv(39; CHECK-NOT: udiv40; CHECK: for.body:41 42define void @unsafe_udiv(i64 %x, i64 %m, i64 %n, ptr %p, ptr %q) nounwind {43entry:44 br label %for.body45 46for.body: ; preds = %entry, %for.inc47 %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]48 %arrayidx = getelementptr inbounds i32, ptr %p, i64 %i.0249 %0 = load i32, ptr %arrayidx, align 450 %tobool = icmp eq i32 %0, 051 br i1 %tobool, label %for.inc, label %if.then52 53if.then: ; preds = %for.body54 %div = udiv i64 %x, %m55 %arrayidx1 = getelementptr inbounds i64, ptr %q, i64 %i.0256 store i64 %div, ptr %arrayidx1, align 857 br label %for.inc58 59for.inc: ; preds = %if.then, %for.body60 %inc = add i64 %i.02, 161 %cmp = icmp slt i64 %inc, %n62 br i1 %cmp, label %for.body, label %for.end63 64for.end: ; preds = %for.inc, %entry65 ret void66}67 68; SDiv is safe to speculate if the denominator is known non-zero and69; known to have at least one zero bit.70 71; CHECK-LABEL: @safe_sdiv(72; CHECK: %div = sdiv i64 %x, 273; CHECK-NEXT: br label %for.body74 75define void @safe_sdiv(i64 %x, i64 %m, i64 %n, ptr %p, ptr %q) nounwind {76entry:77 %and = and i64 %m, -378 br label %for.body79 80for.body: ; preds = %entry, %for.inc81 %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]82 %arrayidx = getelementptr inbounds i32, ptr %p, i64 %i.0283 %0 = load i32, ptr %arrayidx, align 484 %tobool = icmp eq i32 %0, 085 br i1 %tobool, label %for.inc, label %if.then86 87if.then: ; preds = %for.body88 %div = sdiv i64 %x, 289 %arrayidx1 = getelementptr inbounds i64, ptr %q, i64 %i.0290 store i64 %div, ptr %arrayidx1, align 891 br label %for.inc92 93for.inc: ; preds = %if.then, %for.body94 %inc = add i64 %i.02, 195 %cmp = icmp slt i64 %inc, %n96 br i1 %cmp, label %for.body, label %for.end97 98for.end: ; preds = %for.inc, %entry99 ret void100}101 102; SDiv is unsafe to speculate if the denominator is not known non-zero.103 104; CHECK-LABEL: @unsafe_sdiv_a(105; CHECK-NOT: sdiv106; CHECK: for.body:107 108define void @unsafe_sdiv_a(i64 %x, i64 %m, i64 %n, ptr %p, ptr %q) nounwind {109entry:110 %or = or i64 %m, 1111 br label %for.body112 113for.body: ; preds = %entry, %for.inc114 %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]115 %arrayidx = getelementptr inbounds i32, ptr %p, i64 %i.02116 %0 = load i32, ptr %arrayidx, align 4117 %tobool = icmp eq i32 %0, 0118 br i1 %tobool, label %for.inc, label %if.then119 120if.then: ; preds = %for.body121 %div = sdiv i64 %x, %or122 %arrayidx1 = getelementptr inbounds i64, ptr %q, i64 %i.02123 store i64 %div, ptr %arrayidx1, align 8124 br label %for.inc125 126for.inc: ; preds = %if.then, %for.body127 %inc = add i64 %i.02, 1128 %cmp = icmp slt i64 %inc, %n129 br i1 %cmp, label %for.body, label %for.end130 131for.end: ; preds = %for.inc, %entry132 ret void133}134 135; SDiv is unsafe to speculate if the denominator is not known to have a zero bit.136 137; CHECK-LABEL: @unsafe_sdiv_b(138; CHECK-NOT: sdiv139; CHECK: for.body:140 141define void @unsafe_sdiv_b(i64 %x, i64 %m, i64 %n, ptr %p, ptr %q) nounwind {142entry:143 %and = and i64 %m, -3144 br label %for.body145 146for.body: ; preds = %entry, %for.inc147 %i.02 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]148 %arrayidx = getelementptr inbounds i32, ptr %p, i64 %i.02149 %0 = load i32, ptr %arrayidx, align 4150 %tobool = icmp eq i32 %0, 0151 br i1 %tobool, label %for.inc, label %if.then152 153if.then: ; preds = %for.body154 %div = sdiv i64 %x, %and155 %arrayidx1 = getelementptr inbounds i64, ptr %q, i64 %i.02156 store i64 %div, ptr %arrayidx1, align 8157 br label %for.inc158 159for.inc: ; preds = %if.then, %for.body160 %inc = add i64 %i.02, 1161 %cmp = icmp slt i64 %inc, %n162 br i1 %cmp, label %for.body, label %for.end163 164for.end: ; preds = %for.inc, %entry165 ret void166}167 168; SDiv is unsafe to speculate inside an infinite loop.169 170define void @unsafe_sdiv_c(i64 %a, i64 %b, ptr %p) {171entry:172; CHECK: entry:173; CHECK-NOT: sdiv174; CHECK: br label %for.body175 br label %for.body176 177for.body:178 %c = icmp eq i64 %b, 0179 br i1 %c, label %backedge, label %if.then180 181if.then:182 %d = sdiv i64 %a, %b183 store i64 %d, ptr %p184 br label %backedge185 186backedge:187 br label %for.body188}189