OLD | NEW |
(Empty) | |
| 1 ; RUN: opt < %s -insert-divide-check -S | FileCheck -check-prefix=OPT %s |
| 2 |
| 3 declare void @foo() |
| 4 |
| 5 ; Check for multiple divs that occur one block. |
| 6 define i32 @twodivs_one_block(i32 %x, i32 %y) #0 { |
| 7 entry: |
| 8 call void @foo() |
| 9 br label %divblock |
| 10 divblock: |
| 11 %div1 = sdiv i32 %x, %y |
| 12 %div2 = sdiv i32 %x, %y |
| 13 ; OPT: %0 = icmp eq i32 %y, 0 |
| 14 ; OPT-NEXT: br i1 %0, label %divrem.by.zero, label %guarded.divrem |
| 15 ; OPT: guarded.divrem: |
| 16 ; OPT-NEXT: sdiv |
| 17 ; OPT: %1 = icmp eq i32 %y, 0 |
| 18 ; OPT-NEXT: br i1 %1, label %divrem.by.zero1, label %guarded.divrem2 |
| 19 ; OPT: guarded.divrem2: |
| 20 ; OPT-NEXT: sdiv |
| 21 ; OPT-NEXT: add |
| 22 ; OPT: divrem.by.zero: |
| 23 ; OPT-NEXT: call void @llvm.trap() |
| 24 ; OPT-NEXT: unreachable |
| 25 ; OPT: divrem.by.zero1: |
| 26 ; OPT-NEXT: call void @llvm.trap() |
| 27 ; OPT-NEXT: unreachable |
| 28 %sum = add i32 %div1, %div2 |
| 29 ret i32 %sum |
| 30 } |
| 31 |
| 32 define i32 @twodivs_three_blocks(i32 %x, i32 %y) #0 { |
| 33 entry: |
| 34 call void @foo() |
| 35 br label %divblock |
| 36 divblock: |
| 37 %div1 = sdiv i32 %x, %y |
| 38 ; OPT: %0 = icmp eq i32 %y, 0 |
| 39 ; OPT-NEXT: br i1 %0, label %divrem.by.zero, label %guarded.divrem |
| 40 ; OPT: guarded.divrem: |
| 41 ; OPT-NEXT: sdiv |
| 42 ; OPT-NEXT: br label %exitblock |
| 43 br label %exitblock |
| 44 exitblock: |
| 45 call void @foo() |
| 46 %div2 = sdiv i32 %x, %y |
| 47 ; OPT: %1 = icmp eq i32 %y, 0 |
| 48 ; OPT-NEXT: br i1 %1, label %divrem.by.zero1, label %guarded.divrem2 |
| 49 ; OPT: guarded.divrem2: |
| 50 ; OPT-NEXT: sdiv |
| 51 ; OPT-NEXT: add |
| 52 ; OPT: divrem.by.zero: |
| 53 ; OPT-NEXT: call void @llvm.trap() |
| 54 ; OPT-NEXT: unreachable |
| 55 ; OPT: divrem.by.zero1: |
| 56 ; OPT-NEXT: call void @llvm.trap() |
| 57 ; OPT-NEXT: unreachable |
| 58 %sum = add i32 %div1, %div2 |
| 59 ret i32 %sum |
| 60 } |
| 61 |
| 62 ; Check for divs that occur in blocks with multiple predecessors. |
| 63 define i32 @onediv_two_predecessors(i32 %x, i32 %y) #0 { |
| 64 entry: |
| 65 call void @foo() |
| 66 br label %divblock |
| 67 divblock: |
| 68 %x1 = phi i32 [%x, %entry], [%x2, %divblock] |
| 69 %div1 = sdiv i32 %x, %y |
| 70 ; OPT: %0 = icmp eq i32 %y, 0 |
| 71 ; OPT-NEXT: br i1 %0, label %divrem.by.zero, label %guarded.divrem |
| 72 ; OPT: guarded.divrem: |
| 73 ; OPT-NEXT: sdiv |
| 74 ; OPT-NEXT: sub |
| 75 ; OPT: divrem.by.zero: |
| 76 ; OPT-NEXT: call void @llvm.trap() |
| 77 ; OPT-NEXT: unreachable |
| 78 %x2 = sub i32 %x1, 1 |
| 79 %p = icmp ne i32 %x2, 0 |
| 80 br i1 %p, label %divblock, label %exitblock |
| 81 exitblock: |
| 82 call void @foo() |
| 83 ret i32 %div1 |
| 84 } |
| 85 |
OLD | NEW |