xref: /llvm-project/llvm/test/Transforms/InstCombine/div-i1.ll (revision d01aec4c769d50fb92e86decd41d077c94105841)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3
4define i1 @sdiv_by_zero_indirect_is_poison(i1 %c, i1 %x, i1 %y) {
5; CHECK-LABEL: @sdiv_by_zero_indirect_is_poison(
6; CHECK-NEXT:    br i1 [[C:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
7; CHECK:       true:
8; CHECK-NEXT:    br label [[DONE:%.*]]
9; CHECK:       false:
10; CHECK-NEXT:    br label [[DONE]]
11; CHECK:       done:
12; CHECK-NEXT:    ret i1 poison
13;
14  br i1 %c, label %true, label %false
15true:
16  %y_true = and i1 %y, 0
17  br label %done
18false:
19  %y_false = and i1 %y, 0
20  br label %done
21done:
22  %yy = phi i1 [ %y_false, %false ], [ %y_true, %true ]
23  %r = sdiv i1 %x, %yy
24  ret i1 %r
25}
26
27define i1 @udiv_by_zero_indirect_is_poison(i1 %c, i1 %x, i1 %y) {
28; CHECK-LABEL: @udiv_by_zero_indirect_is_poison(
29; CHECK-NEXT:    br i1 [[C:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
30; CHECK:       true:
31; CHECK-NEXT:    br label [[DONE:%.*]]
32; CHECK:       false:
33; CHECK-NEXT:    br label [[DONE]]
34; CHECK:       done:
35; CHECK-NEXT:    ret i1 poison
36;
37  br i1 %c, label %true, label %false
38true:
39  %y_true = and i1 %y, 0
40  br label %done
41false:
42  %y_false = and i1 %y, 0
43  br label %done
44done:
45  %yy = phi i1 [ %y_false, %false ], [ %y_true, %true ]
46  %r = udiv i1 %x, %yy
47  ret i1 %r
48}
49
50define i1 @srem_by_zero_indirect_is_poison(i1 %c, i1 %x, i1 %y) {
51; CHECK-LABEL: @srem_by_zero_indirect_is_poison(
52; CHECK-NEXT:    br i1 [[C:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
53; CHECK:       true:
54; CHECK-NEXT:    br label [[DONE:%.*]]
55; CHECK:       false:
56; CHECK-NEXT:    br label [[DONE]]
57; CHECK:       done:
58; CHECK-NEXT:    ret i1 poison
59;
60  br i1 %c, label %true, label %false
61true:
62  %y_true = and i1 %y, 0
63  br label %done
64false:
65  %y_false = and i1 %y, 0
66  br label %done
67done:
68  %yy = phi i1 [ %y_false, %false ], [ %y_true, %true ]
69  %r = srem i1 %x, %yy
70  ret i1 %r
71}
72
73define i1 @urem_by_zero_indirect_is_poison(i1 %c, i1 %x, i1 %y) {
74; CHECK-LABEL: @urem_by_zero_indirect_is_poison(
75; CHECK-NEXT:    br i1 [[C:%.*]], label [[TRUE:%.*]], label [[FALSE:%.*]]
76; CHECK:       true:
77; CHECK-NEXT:    br label [[DONE:%.*]]
78; CHECK:       false:
79; CHECK-NEXT:    br label [[DONE]]
80; CHECK:       done:
81; CHECK-NEXT:    ret i1 poison
82;
83  br i1 %c, label %true, label %false
84true:
85  %y_true = and i1 %y, 0
86  br label %done
87false:
88  %y_false = and i1 %y, 0
89  br label %done
90done:
91  %yy = phi i1 [ %y_false, %false ], [ %y_true, %true ]
92  %r = urem i1 %x, %yy
93  ret i1 %r
94}
95
96define i1 @sdiv_i1_is_op0(i1 %x, i1 %y) {
97; CHECK-LABEL: @sdiv_i1_is_op0(
98; CHECK-NEXT:    ret i1 [[X:%.*]]
99;
100  %r = sdiv i1 %x, %y
101  ret i1 %r
102}
103
104define i1 @udiv_i1_is_op0(i1 %x, i1 %y) {
105; CHECK-LABEL: @udiv_i1_is_op0(
106; CHECK-NEXT:    ret i1 [[X:%.*]]
107;
108  %r = udiv i1 %x, %y
109  ret i1 %r
110}
111
112define i1 @srem_i1_is_zero(i1 %x, i1 %y) {
113; CHECK-LABEL: @srem_i1_is_zero(
114; CHECK-NEXT:    ret i1 false
115;
116  %r = srem i1 %x, %y
117  ret i1 %r
118}
119
120define i1 @urem_i1_is_zero(i1 %x, i1 %y) {
121; CHECK-LABEL: @urem_i1_is_zero(
122; CHECK-NEXT:    ret i1 false
123;
124  %r = urem i1 %x, %y
125  ret i1 %r
126}
127
128declare void @llvm.assume(i1 noundef)
129
130define i1 @pt62607() {
131; CHECK-LABEL: @pt62607(
132; CHECK-NEXT:  entry_1:
133; CHECK-NEXT:    br label [[LOOP_5:%.*]]
134; CHECK:       loop_5:
135; CHECK-NEXT:    br i1 poison, label [[LOOP_5]], label [[LOOP_EXIT_8:%.*]]
136; CHECK:       loop_exit_8:
137; CHECK-NEXT:    ret i1 false
138;
139entry_1:
140  %val_i1_38 = trunc i8 109 to i1
141  br label %loop_5
142loop_5:  ; preds = %loop_5, %entry_1
143  %loop_cnt_i1_26.0 = phi i1 [ false, %entry_1 ], [ %val_i1_55, %loop_5 ]
144  %val_i1_55 = add i1 %loop_cnt_i1_26.0, true
145  call void @llvm.assume(i1 %val_i1_55)
146  %val_i1_67 = udiv i1 %val_i1_38, %loop_cnt_i1_26.0
147  br i1 %val_i1_67, label %loop_5, label %loop_exit_8
148loop_exit_8:  ; preds = %loop_5
149  ret i1 false
150}
151