brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.8 KiB · 03cb555 Raw
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