[ARM] Better OR's for MVE compares
[llvm-core.git] / test / Transforms / InstCombine / icmp-div-constant.ll
blob4c0a56825be67c250e1780d8836dac25e7f7a114
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
4 ; PR30281 - https://llvm.org/bugs/show_bug.cgi?id=30281
6 ; All of these tests contain foldable division-by-constant instructions, but we
7 ; can't assert that those folds have occurred before we process the later icmp.
9 define i32 @icmp_div(i16 %a, i16 %c) {
10 ; CHECK-LABEL: @icmp_div(
11 ; CHECK-NEXT:  entry:
12 ; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i16 %a, 0
13 ; CHECK-NEXT:    br i1 [[TOBOOL]], label %then, label %exit
14 ; CHECK:       then:
15 ; CHECK-NEXT:    [[NOT_CMP:%.*]] = icmp eq i16 %c, 0
16 ; CHECK-NEXT:    [[PHITMP1:%.*]] = sext i1 [[NOT_CMP]] to i32
17 ; CHECK-NEXT:    br label %exit
18 ; CHECK:       exit:
19 ; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ -1, %entry ], [ [[PHITMP1]], %then ]
20 ; CHECK-NEXT:    ret i32 [[PHI]]
22 entry:
23   %tobool = icmp eq i16 %a, 0
24   br i1 %tobool, label %then, label %exit
26 then:
27   %div = sdiv i16 %c, -1
28   %cmp = icmp ne i16 %div, 0
29   br label %exit
31 exit:
32   %phi = phi i1 [ false, %entry ], [ %cmp, %then ]
33   %zext = zext i1 %phi to i32
34   %add = add nsw i32 %zext, -1
35   ret i32 %add
38 define i32 @icmp_div2(i16 %a, i16 %c) {
39 ; CHECK-LABEL: @icmp_div2(
40 ; CHECK-NEXT:  entry:
41 ; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i16 %a, 0
42 ; CHECK-NEXT:    br i1 [[TOBOOL]], label %then, label %exit
43 ; CHECK:       then:
44 ; CHECK-NEXT:    br label %exit
45 ; CHECK:       exit:
46 ; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ -1, %entry ], [ 0, %then ]
47 ; CHECK-NEXT:    ret i32 [[PHI]]
49 entry:
50   %tobool = icmp eq i16 %a, 0
51   br i1 %tobool, label %then, label %exit
53 then:
54   %div = sdiv i16 %c, 0
55   %cmp = icmp ne i16 %div, 0
56   br label %exit
58 exit:
59   %phi = phi i1 [ false, %entry ], [ %cmp, %then ]
60   %zext = zext i1 %phi to i32
61   %add = add nsw i32 %zext, -1
62   ret i32 %add
65 define i32 @icmp_div3(i16 %a, i16 %c) {
66 ; CHECK-LABEL: @icmp_div3(
67 ; CHECK-NEXT:  entry:
68 ; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i16 %a, 0
69 ; CHECK-NEXT:    br i1 [[TOBOOL]], label %then, label %exit
70 ; CHECK:       then:
71 ; CHECK-NEXT:    [[NOT_CMP:%.*]] = icmp eq i16 %c, 0
72 ; CHECK-NEXT:    [[PHITMP1:%.*]] = sext i1 [[NOT_CMP]] to i32
73 ; CHECK-NEXT:    br label %exit
74 ; CHECK:       exit:
75 ; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ -1, %entry ], [ [[PHITMP1]], %then ]
76 ; CHECK-NEXT:    ret i32 [[PHI]]
78 entry:
79   %tobool = icmp eq i16 %a, 0
80   br i1 %tobool, label %then, label %exit
82 then:
83   %div = sdiv i16 %c, 1
84   %cmp = icmp ne i16 %div, 0
85   br label %exit
87 exit:
88   %phi = phi i1 [ false, %entry ], [ %cmp, %then ]
89   %zext = zext i1 %phi to i32
90   %add = add nsw i32 %zext, -1
91   ret i32 %add