xref: /llvm-project/llvm/test/Transforms/LICM/speculate-div.ll (revision 2647547ee44f509a34ff9709b63bd7603ca59f5d)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=licm -S | FileCheck %s
3
4declare void @maythrow()
5declare void @use(i16)
6
7define void @sdiv_not_ok(i16 %n, i16 %xx) {
8; CHECK-LABEL: @sdiv_not_ok(
9; CHECK-NEXT:  entry:
10; CHECK-NEXT:    [[X:%.*]] = or i16 [[XX:%.*]], 1
11; CHECK-NEXT:    br label [[LOOP:%.*]]
12; CHECK:       loop:
13; CHECK-NEXT:    call void @maythrow()
14; CHECK-NEXT:    [[DIV:%.*]] = sdiv i16 [[N:%.*]], [[X]]
15; CHECK-NEXT:    call void @use(i16 [[DIV]])
16; CHECK-NEXT:    br label [[LOOP]]
17;
18entry:
19  %x = or i16 %xx, 1
20  br label %loop
21loop:
22  call void @maythrow()
23  %div = sdiv i16 %n, %x
24  call void @use(i16 %div)
25  br label %loop
26}
27
28define void @srem_not_ok2(i16 %nn, i16 %x) {
29; CHECK-LABEL: @srem_not_ok2(
30; CHECK-NEXT:  entry:
31; CHECK-NEXT:    [[N:%.*]] = and i16 [[NN:%.*]], 1323
32; CHECK-NEXT:    br label [[LOOP:%.*]]
33; CHECK:       loop:
34; CHECK-NEXT:    call void @maythrow()
35; CHECK-NEXT:    [[DIV:%.*]] = srem i16 [[N]], [[X:%.*]]
36; CHECK-NEXT:    call void @use(i16 [[DIV]])
37; CHECK-NEXT:    br label [[LOOP]]
38;
39entry:
40  %n = and i16 %nn, 1323
41  br label %loop
42loop:
43  call void @maythrow()
44  %div = srem i16 %n, %x
45  call void @use(i16 %div)
46  br label %loop
47}
48
49define void @sdiv_ok(i16 %n, i16 %xx) {
50; CHECK-LABEL: @sdiv_ok(
51; CHECK-NEXT:  entry:
52; CHECK-NEXT:    [[XO:%.*]] = or i16 [[XX:%.*]], 1
53; CHECK-NEXT:    [[X:%.*]] = and i16 [[XO]], 123
54; CHECK-NEXT:    br label [[LOOP:%.*]]
55; CHECK:       loop:
56; CHECK-NEXT:    call void @maythrow()
57; CHECK-NEXT:    [[DIV:%.*]] = sdiv i16 [[N:%.*]], [[X]]
58; CHECK-NEXT:    call void @use(i16 [[DIV]])
59; CHECK-NEXT:    br label [[LOOP]]
60;
61entry:
62  %xo = or i16 %xx, 1
63  %x = and i16 %xo, 123
64  br label %loop
65loop:
66  call void @maythrow()
67  %div = sdiv i16 %n, %x
68  call void @use(i16 %div)
69  br label %loop
70}
71
72define void @srem_ok2(i16 %nn, i16 %xx) {
73; CHECK-LABEL: @srem_ok2(
74; CHECK-NEXT:  entry:
75; CHECK-NEXT:    [[N:%.*]] = and i16 [[NN:%.*]], 123
76; CHECK-NEXT:    [[X:%.*]] = or i16 [[XX:%.*]], 1
77; CHECK-NEXT:    br label [[LOOP:%.*]]
78; CHECK:       loop:
79; CHECK-NEXT:    call void @maythrow()
80; CHECK-NEXT:    [[DIV:%.*]] = srem i16 [[N]], [[X]]
81; CHECK-NEXT:    call void @use(i16 [[DIV]])
82; CHECK-NEXT:    br label [[LOOP]]
83;
84entry:
85  %n = and i16 %nn, 123
86  %x = or i16 %xx, 1
87  br label %loop
88loop:
89  call void @maythrow()
90  %div = srem i16 %n, %x
91  call void @use(i16 %div)
92  br label %loop
93}
94
95define void @udiv_not_ok(i16 %n, i16 %xx) {
96; CHECK-LABEL: @udiv_not_ok(
97; CHECK-NEXT:  entry:
98; CHECK-NEXT:    [[X:%.*]] = xor i16 [[XX:%.*]], 1
99; CHECK-NEXT:    br label [[LOOP:%.*]]
100; CHECK:       loop:
101; CHECK-NEXT:    call void @maythrow()
102; CHECK-NEXT:    [[DIV:%.*]] = udiv i16 [[N:%.*]], [[X]]
103; CHECK-NEXT:    call void @use(i16 [[DIV]])
104; CHECK-NEXT:    br label [[LOOP]]
105;
106entry:
107  %x = xor i16 %xx, 1
108  br label %loop
109loop:
110  call void @maythrow()
111  %div = udiv i16 %n, %x
112  call void @use(i16 %div)
113  br label %loop
114}
115
116define void @udiv_ok(i16 %n, i16 %xx) {
117; CHECK-LABEL: @udiv_ok(
118; CHECK-NEXT:  entry:
119; CHECK-NEXT:    [[X:%.*]] = or i16 [[XX:%.*]], 1
120; CHECK-NEXT:    br label [[LOOP:%.*]]
121; CHECK:       loop:
122; CHECK-NEXT:    call void @maythrow()
123; CHECK-NEXT:    [[DIV:%.*]] = udiv i16 [[N:%.*]], [[X]]
124; CHECK-NEXT:    call void @use(i16 [[DIV]])
125; CHECK-NEXT:    br label [[LOOP]]
126;
127entry:
128  %x = or i16 %xx, 1
129  br label %loop
130loop:
131  call void @maythrow()
132  %div = udiv i16 %n, %x
133  call void @use(i16 %div)
134  br label %loop
135}
136