annotate llvm/test/Transforms/CodeGenPrepare/X86/overflow-intrinsics.ll @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1f2b6ac9f198
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
anatofuz
parents:
diff changeset
2 ; RUN: opt -codegenprepare -S < %s | FileCheck %s
anatofuz
parents:
diff changeset
3 ; RUN: opt -enable-debugify -codegenprepare -S < %s 2>&1 | FileCheck %s -check-prefix=DEBUG
anatofuz
parents:
diff changeset
4
anatofuz
parents:
diff changeset
5 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
anatofuz
parents:
diff changeset
6 target triple = "x86_64-apple-darwin10.0.0"
anatofuz
parents:
diff changeset
7
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
8 define i64 @uaddo1_overflow_used(i64 %a, i64 %b) nounwind ssp {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
9 ; CHECK-LABEL: @uaddo1_overflow_used(
150
anatofuz
parents:
diff changeset
10 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])
anatofuz
parents:
diff changeset
11 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
12 ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
anatofuz
parents:
diff changeset
13 ; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42
anatofuz
parents:
diff changeset
14 ; CHECK-NEXT: ret i64 [[Q]]
anatofuz
parents:
diff changeset
15 ;
anatofuz
parents:
diff changeset
16 %add = add i64 %b, %a
anatofuz
parents:
diff changeset
17 %cmp = icmp ult i64 %add, %a
anatofuz
parents:
diff changeset
18 %Q = select i1 %cmp, i64 %b, i64 42
anatofuz
parents:
diff changeset
19 ret i64 %Q
anatofuz
parents:
diff changeset
20 }
anatofuz
parents:
diff changeset
21
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
22 define i64 @uaddo1_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
23 ; CHECK-LABEL: @uaddo1_math_overflow_used(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
24 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
25 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
26 ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
27 ; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
28 ; CHECK-NEXT: store i64 [[MATH]], ptr [[RES:%.*]]
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
29 ; CHECK-NEXT: ret i64 [[Q]]
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
30 ;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
31 %add = add i64 %b, %a
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
32 %cmp = icmp ult i64 %add, %a
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
33 %Q = select i1 %cmp, i64 %b, i64 42
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
34 store i64 %add, ptr %res
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
35 ret i64 %Q
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
36 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
37
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
38 define i64 @uaddo2_overflow_used(i64 %a, i64 %b) nounwind ssp {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
39 ; CHECK-LABEL: @uaddo2_overflow_used(
150
anatofuz
parents:
diff changeset
40 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])
anatofuz
parents:
diff changeset
41 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
42 ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
anatofuz
parents:
diff changeset
43 ; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42
anatofuz
parents:
diff changeset
44 ; CHECK-NEXT: ret i64 [[Q]]
anatofuz
parents:
diff changeset
45 ;
anatofuz
parents:
diff changeset
46 %add = add i64 %b, %a
anatofuz
parents:
diff changeset
47 %cmp = icmp ult i64 %add, %b
anatofuz
parents:
diff changeset
48 %Q = select i1 %cmp, i64 %b, i64 42
anatofuz
parents:
diff changeset
49 ret i64 %Q
anatofuz
parents:
diff changeset
50 }
anatofuz
parents:
diff changeset
51
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
52 define i64 @uaddo2_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
53 ; CHECK-LABEL: @uaddo2_math_overflow_used(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
54 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
55 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
56 ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
57 ; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
58 ; CHECK-NEXT: store i64 [[MATH]], ptr [[RES:%.*]]
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
59 ; CHECK-NEXT: ret i64 [[Q]]
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
60 ;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
61 %add = add i64 %b, %a
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
62 %cmp = icmp ult i64 %add, %b
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
63 %Q = select i1 %cmp, i64 %b, i64 42
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
64 store i64 %add, ptr %res
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
65 ret i64 %Q
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
66 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
67
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
68 define i64 @uaddo3_overflow_used(i64 %a, i64 %b) nounwind ssp {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
69 ; CHECK-LABEL: @uaddo3_overflow_used(
150
anatofuz
parents:
diff changeset
70 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])
anatofuz
parents:
diff changeset
71 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
72 ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
anatofuz
parents:
diff changeset
73 ; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42
anatofuz
parents:
diff changeset
74 ; CHECK-NEXT: ret i64 [[Q]]
anatofuz
parents:
diff changeset
75 ;
anatofuz
parents:
diff changeset
76 %add = add i64 %b, %a
anatofuz
parents:
diff changeset
77 %cmp = icmp ugt i64 %b, %add
anatofuz
parents:
diff changeset
78 %Q = select i1 %cmp, i64 %b, i64 42
anatofuz
parents:
diff changeset
79 ret i64 %Q
anatofuz
parents:
diff changeset
80 }
anatofuz
parents:
diff changeset
81
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
82 define i64 @uaddo3_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
83 ; CHECK-LABEL: @uaddo3_math_overflow_used(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
84 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
85 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
86 ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
87 ; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
88 ; CHECK-NEXT: store i64 [[MATH]], ptr [[RES:%.*]]
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
89 ; CHECK-NEXT: ret i64 [[Q]]
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
90 ;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
91 %add = add i64 %b, %a
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
92 %cmp = icmp ugt i64 %b, %add
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
93 %Q = select i1 %cmp, i64 %b, i64 42
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
94 store i64 %add, ptr %res
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
95 ret i64 %Q
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
96 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
97
150
anatofuz
parents:
diff changeset
98 ; TODO? CGP sinks the compare before we have a chance to form the overflow intrinsic.
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 define i64 @uaddo4(i64 %a, i64 %b, i1 %c) nounwind ssp {
anatofuz
parents:
diff changeset
101 ; CHECK-LABEL: @uaddo4(
anatofuz
parents:
diff changeset
102 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
103 ; CHECK-NEXT: [[ADD:%.*]] = add i64 [[B:%.*]], [[A:%.*]]
anatofuz
parents:
diff changeset
104 ; CHECK-NEXT: br i1 [[C:%.*]], label [[NEXT:%.*]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
105 ; CHECK: next:
anatofuz
parents:
diff changeset
106 ; CHECK-NEXT: [[TMP0:%.*]] = icmp ugt i64 [[B]], [[ADD]]
anatofuz
parents:
diff changeset
107 ; CHECK-NEXT: [[Q:%.*]] = select i1 [[TMP0]], i64 [[B]], i64 42
anatofuz
parents:
diff changeset
108 ; CHECK-NEXT: ret i64 [[Q]]
anatofuz
parents:
diff changeset
109 ; CHECK: exit:
anatofuz
parents:
diff changeset
110 ; CHECK-NEXT: ret i64 0
anatofuz
parents:
diff changeset
111 ;
anatofuz
parents:
diff changeset
112 entry:
anatofuz
parents:
diff changeset
113 %add = add i64 %b, %a
anatofuz
parents:
diff changeset
114 %cmp = icmp ugt i64 %b, %add
anatofuz
parents:
diff changeset
115 br i1 %c, label %next, label %exit
anatofuz
parents:
diff changeset
116
anatofuz
parents:
diff changeset
117 next:
anatofuz
parents:
diff changeset
118 %Q = select i1 %cmp, i64 %b, i64 42
anatofuz
parents:
diff changeset
119 ret i64 %Q
anatofuz
parents:
diff changeset
120
anatofuz
parents:
diff changeset
121 exit:
anatofuz
parents:
diff changeset
122 ret i64 0
anatofuz
parents:
diff changeset
123 }
anatofuz
parents:
diff changeset
124
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
125 define i64 @uaddo5(i64 %a, i64 %b, ptr %ptr, i1 %c) nounwind ssp {
150
anatofuz
parents:
diff changeset
126 ; CHECK-LABEL: @uaddo5(
anatofuz
parents:
diff changeset
127 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
128 ; CHECK-NEXT: [[ADD:%.*]] = add i64 [[B:%.*]], [[A:%.*]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
129 ; CHECK-NEXT: store i64 [[ADD]], ptr [[PTR:%.*]]
150
anatofuz
parents:
diff changeset
130 ; CHECK-NEXT: br i1 [[C:%.*]], label [[NEXT:%.*]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
131 ; CHECK: next:
anatofuz
parents:
diff changeset
132 ; CHECK-NEXT: [[TMP0:%.*]] = icmp ugt i64 [[B]], [[ADD]]
anatofuz
parents:
diff changeset
133 ; CHECK-NEXT: [[Q:%.*]] = select i1 [[TMP0]], i64 [[B]], i64 42
anatofuz
parents:
diff changeset
134 ; CHECK-NEXT: ret i64 [[Q]]
anatofuz
parents:
diff changeset
135 ; CHECK: exit:
anatofuz
parents:
diff changeset
136 ; CHECK-NEXT: ret i64 0
anatofuz
parents:
diff changeset
137 ;
anatofuz
parents:
diff changeset
138 entry:
anatofuz
parents:
diff changeset
139 %add = add i64 %b, %a
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
140 store i64 %add, ptr %ptr
150
anatofuz
parents:
diff changeset
141 %cmp = icmp ugt i64 %b, %add
anatofuz
parents:
diff changeset
142 br i1 %c, label %next, label %exit
anatofuz
parents:
diff changeset
143
anatofuz
parents:
diff changeset
144 next:
anatofuz
parents:
diff changeset
145 %Q = select i1 %cmp, i64 %b, i64 42
anatofuz
parents:
diff changeset
146 ret i64 %Q
anatofuz
parents:
diff changeset
147
anatofuz
parents:
diff changeset
148 exit:
anatofuz
parents:
diff changeset
149 ret i64 0
anatofuz
parents:
diff changeset
150 }
anatofuz
parents:
diff changeset
151
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
152 ; Instcombine folds (a + b <u a) to (a ^ -1 <u b). Make sure we match this
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
153 ; pattern as well.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
154 define i64 @uaddo6_xor(i64 %a, i64 %b) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
155 ; CHECK-LABEL: @uaddo6_xor(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
156 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[A:%.*]], i64 [[B:%.*]])
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
157 ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
158 ; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
159 ; CHECK-NEXT: ret i64 [[Q]]
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
160 ;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
161 %x = xor i64 %a, -1
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
162 %cmp = icmp ult i64 %x, %b
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
163 %Q = select i1 %cmp, i64 %b, i64 42
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
164 ret i64 %Q
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
165 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
166
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
167 define i64 @uaddo6_xor_commuted(i64 %a, i64 %b) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
168 ; CHECK-LABEL: @uaddo6_xor_commuted(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
169 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[A:%.*]], i64 [[B:%.*]])
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
170 ; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
171 ; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
172 ; CHECK-NEXT: ret i64 [[Q]]
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
173 ;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
174 %x = xor i64 %a, -1
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
175 %cmp = icmp ult i64 %x, %b
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
176 %Q = select i1 %cmp, i64 %b, i64 42
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
177 ret i64 %Q
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
178 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
179
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
180 declare void @use(i64)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
181
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
182 define i64 @uaddo6_xor_multi_use(i64 %a, i64 %b) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
183 ; CHECK-LABEL: @uaddo6_xor_multi_use(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
184 ; CHECK-NEXT: [[X:%.*]] = xor i64 -1, [[A:%.*]]
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
185 ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[X]], [[B:%.*]]
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
186 ; CHECK-NEXT: [[Q:%.*]] = select i1 [[CMP]], i64 [[B]], i64 42
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
187 ; CHECK-NEXT: call void @use(i64 [[X]])
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
188 ; CHECK-NEXT: ret i64 [[Q]]
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
189 ;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
190 %x = xor i64 -1, %a
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
191 %cmp = icmp ult i64 %x, %b
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
192 %Q = select i1 %cmp, i64 %b, i64 42
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
193 call void @use(i64 %x)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
194 ret i64 %Q
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
195 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
196
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
197 ; Make sure we do not use the XOR binary operator as insert point, as it may
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
198 ; come before the second operand of the overflow intrinsic.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
199 define i1 @uaddo6_xor_op_after_XOR(i32 %a, ptr %b.ptr) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
200 ; CHECK-LABEL: @uaddo6_xor_op_after_XOR(
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
201 ; CHECK-NEXT: [[B:%.*]] = load i32, ptr [[B_PTR:%.*]], align 8
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
202 ; CHECK-NEXT: [[TMP1:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[A:%.*]], i32 [[B]])
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
203 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
204 ; CHECK-NEXT: [[OV:%.*]] = xor i1 [[OV1]], true
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
205 ; CHECK-NEXT: ret i1 [[OV]]
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
206 ;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
207 %x = xor i32 %a, -1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
208 %b = load i32, ptr %b.ptr, align 8
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
209 %cmp14 = icmp ugt i32 %b, %x
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
210 %ov = xor i1 %cmp14, true
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
211 ret i1 %ov
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
212 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
213
150
anatofuz
parents:
diff changeset
214 ; When adding 1, the general pattern for add-overflow may be different due to icmp canonicalization.
anatofuz
parents:
diff changeset
215 ; PR31754: https://bugs.llvm.org/show_bug.cgi?id=31754
anatofuz
parents:
diff changeset
216
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
217 define i1 @uaddo_i64_increment(i64 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
218 ; CHECK-LABEL: @uaddo_i64_increment(
anatofuz
parents:
diff changeset
219 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[X:%.*]], i64 1)
anatofuz
parents:
diff changeset
220 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
221 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
222 ; CHECK-NEXT: store i64 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
223 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
224 ;
anatofuz
parents:
diff changeset
225 %a = add i64 %x, 1
anatofuz
parents:
diff changeset
226 %ov = icmp eq i64 %a, 0
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
227 store i64 %a, ptr %p
150
anatofuz
parents:
diff changeset
228 ret i1 %ov
anatofuz
parents:
diff changeset
229 }
anatofuz
parents:
diff changeset
230
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
231 define i1 @uaddo_i8_increment_noncanonical_1(i8 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
232 ; CHECK-LABEL: @uaddo_i8_increment_noncanonical_1(
anatofuz
parents:
diff changeset
233 ; CHECK-NEXT: [[TMP1:%.*]] = call { i8, i1 } @llvm.uadd.with.overflow.i8(i8 1, i8 [[X:%.*]])
anatofuz
parents:
diff changeset
234 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i8, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
235 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
236 ; CHECK-NEXT: store i8 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
237 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
238 ;
anatofuz
parents:
diff changeset
239 %a = add i8 1, %x ; commute
anatofuz
parents:
diff changeset
240 %ov = icmp eq i8 %a, 0
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
241 store i8 %a, ptr %p
150
anatofuz
parents:
diff changeset
242 ret i1 %ov
anatofuz
parents:
diff changeset
243 }
anatofuz
parents:
diff changeset
244
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
245 define i1 @uaddo_i32_increment_noncanonical_2(i32 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
246 ; CHECK-LABEL: @uaddo_i32_increment_noncanonical_2(
anatofuz
parents:
diff changeset
247 ; CHECK-NEXT: [[TMP1:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[X:%.*]], i32 1)
anatofuz
parents:
diff changeset
248 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i32, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
249 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
250 ; CHECK-NEXT: store i32 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
251 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
252 ;
anatofuz
parents:
diff changeset
253 %a = add i32 %x, 1
anatofuz
parents:
diff changeset
254 %ov = icmp eq i32 0, %a ; commute
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
255 store i32 %a, ptr %p
150
anatofuz
parents:
diff changeset
256 ret i1 %ov
anatofuz
parents:
diff changeset
257 }
anatofuz
parents:
diff changeset
258
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
259 define i1 @uaddo_i16_increment_noncanonical_3(i16 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
260 ; CHECK-LABEL: @uaddo_i16_increment_noncanonical_3(
anatofuz
parents:
diff changeset
261 ; CHECK-NEXT: [[TMP1:%.*]] = call { i16, i1 } @llvm.uadd.with.overflow.i16(i16 1, i16 [[X:%.*]])
anatofuz
parents:
diff changeset
262 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i16, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
263 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
264 ; CHECK-NEXT: store i16 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
265 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
266 ;
anatofuz
parents:
diff changeset
267 %a = add i16 1, %x ; commute
anatofuz
parents:
diff changeset
268 %ov = icmp eq i16 0, %a ; commute
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
269 store i16 %a, ptr %p
150
anatofuz
parents:
diff changeset
270 ret i1 %ov
anatofuz
parents:
diff changeset
271 }
anatofuz
parents:
diff changeset
272
anatofuz
parents:
diff changeset
273 ; The overflow check may be against the input rather than the sum.
anatofuz
parents:
diff changeset
274
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
275 define i1 @uaddo_i64_increment_alt(i64 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
276 ; CHECK-LABEL: @uaddo_i64_increment_alt(
anatofuz
parents:
diff changeset
277 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[X:%.*]], i64 1)
anatofuz
parents:
diff changeset
278 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
279 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
280 ; CHECK-NEXT: store i64 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
281 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
282 ;
anatofuz
parents:
diff changeset
283 %a = add i64 %x, 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
284 store i64 %a, ptr %p
150
anatofuz
parents:
diff changeset
285 %ov = icmp eq i64 %x, -1
anatofuz
parents:
diff changeset
286 ret i1 %ov
anatofuz
parents:
diff changeset
287 }
anatofuz
parents:
diff changeset
288
anatofuz
parents:
diff changeset
289 ; Make sure insertion is done correctly based on dominance.
anatofuz
parents:
diff changeset
290
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
291 define i1 @uaddo_i64_increment_alt_dom(i64 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
292 ; CHECK-LABEL: @uaddo_i64_increment_alt_dom(
anatofuz
parents:
diff changeset
293 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[X:%.*]], i64 1)
anatofuz
parents:
diff changeset
294 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
295 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
296 ; CHECK-NEXT: store i64 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
297 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
298 ;
anatofuz
parents:
diff changeset
299 %ov = icmp eq i64 %x, -1
anatofuz
parents:
diff changeset
300 %a = add i64 %x, 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
301 store i64 %a, ptr %p
150
anatofuz
parents:
diff changeset
302 ret i1 %ov
anatofuz
parents:
diff changeset
303 }
anatofuz
parents:
diff changeset
304
anatofuz
parents:
diff changeset
305 ; The overflow check may be against the input rather than the sum.
anatofuz
parents:
diff changeset
306
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
307 define i1 @uaddo_i64_decrement_alt(i64 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
308 ; CHECK-LABEL: @uaddo_i64_decrement_alt(
anatofuz
parents:
diff changeset
309 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[X:%.*]], i64 -1)
anatofuz
parents:
diff changeset
310 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
311 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
312 ; CHECK-NEXT: store i64 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
313 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
314 ;
anatofuz
parents:
diff changeset
315 %a = add i64 %x, -1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
316 store i64 %a, ptr %p
150
anatofuz
parents:
diff changeset
317 %ov = icmp ne i64 %x, 0
anatofuz
parents:
diff changeset
318 ret i1 %ov
anatofuz
parents:
diff changeset
319 }
anatofuz
parents:
diff changeset
320
anatofuz
parents:
diff changeset
321 ; Make sure insertion is done correctly based on dominance.
anatofuz
parents:
diff changeset
322
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
323 define i1 @uaddo_i64_decrement_alt_dom(i64 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
324 ; CHECK-LABEL: @uaddo_i64_decrement_alt_dom(
anatofuz
parents:
diff changeset
325 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[X:%.*]], i64 -1)
anatofuz
parents:
diff changeset
326 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
327 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
328 ; CHECK-NEXT: store i64 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
329 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
330 ;
anatofuz
parents:
diff changeset
331 %ov = icmp ne i64 %x, 0
anatofuz
parents:
diff changeset
332 %a = add i64 %x, -1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
333 store i64 %a, ptr %p
150
anatofuz
parents:
diff changeset
334 ret i1 %ov
anatofuz
parents:
diff changeset
335 }
anatofuz
parents:
diff changeset
336
anatofuz
parents:
diff changeset
337 ; No transform for illegal types.
anatofuz
parents:
diff changeset
338
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
339 define i1 @uaddo_i42_increment_illegal_type(i42 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
340 ; CHECK-LABEL: @uaddo_i42_increment_illegal_type(
anatofuz
parents:
diff changeset
341 ; CHECK-NEXT: [[A:%.*]] = add i42 [[X:%.*]], 1
anatofuz
parents:
diff changeset
342 ; CHECK-NEXT: [[OV:%.*]] = icmp eq i42 [[A]], 0
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
343 ; CHECK-NEXT: store i42 [[A]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
344 ; CHECK-NEXT: ret i1 [[OV]]
anatofuz
parents:
diff changeset
345 ;
anatofuz
parents:
diff changeset
346 %a = add i42 %x, 1
anatofuz
parents:
diff changeset
347 %ov = icmp eq i42 %a, 0
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
348 store i42 %a, ptr %p
150
anatofuz
parents:
diff changeset
349 ret i1 %ov
anatofuz
parents:
diff changeset
350 }
anatofuz
parents:
diff changeset
351
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
352 define i1 @usubo_ult_i64_overflow_used(i64 %x, i64 %y, ptr %p) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
353 ; CHECK-LABEL: @usubo_ult_i64_overflow_used(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
354 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[X:%.*]], i64 [[Y:%.*]])
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
355 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
356 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
357 ; CHECK-NEXT: ret i1 [[OV1]]
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
358 ;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
359 %s = sub i64 %x, %y
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
360 %ov = icmp ult i64 %x, %y
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
361 ret i1 %ov
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
362 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
363
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
364 define i1 @usubo_ult_i64_math_overflow_used(i64 %x, i64 %y, ptr %p) {
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
365 ; CHECK-LABEL: @usubo_ult_i64_math_overflow_used(
150
anatofuz
parents:
diff changeset
366 ; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[X:%.*]], i64 [[Y:%.*]])
anatofuz
parents:
diff changeset
367 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
368 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
369 ; CHECK-NEXT: store i64 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
370 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
371 ;
anatofuz
parents:
diff changeset
372 %s = sub i64 %x, %y
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
373 store i64 %s, ptr %p
150
anatofuz
parents:
diff changeset
374 %ov = icmp ult i64 %x, %y
anatofuz
parents:
diff changeset
375 ret i1 %ov
anatofuz
parents:
diff changeset
376 }
anatofuz
parents:
diff changeset
377
anatofuz
parents:
diff changeset
378 ; Verify insertion point for single-BB. Toggle predicate.
anatofuz
parents:
diff changeset
379
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
380 define i1 @usubo_ugt_i32(i32 %x, i32 %y, ptr %p) {
150
anatofuz
parents:
diff changeset
381 ; CHECK-LABEL: @usubo_ugt_i32(
anatofuz
parents:
diff changeset
382 ; CHECK-NEXT: [[TMP1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
anatofuz
parents:
diff changeset
383 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i32, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
384 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
385 ; CHECK-NEXT: store i32 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
386 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
387 ;
anatofuz
parents:
diff changeset
388 %ov = icmp ugt i32 %y, %x
anatofuz
parents:
diff changeset
389 %s = sub i32 %x, %y
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
390 store i32 %s, ptr %p
150
anatofuz
parents:
diff changeset
391 ret i1 %ov
anatofuz
parents:
diff changeset
392 }
anatofuz
parents:
diff changeset
393
anatofuz
parents:
diff changeset
394 ; Constant operand should match.
anatofuz
parents:
diff changeset
395
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
396 define i1 @usubo_ugt_constant_op0_i8(i8 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
397 ; CHECK-LABEL: @usubo_ugt_constant_op0_i8(
anatofuz
parents:
diff changeset
398 ; CHECK-NEXT: [[TMP1:%.*]] = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 42, i8 [[X:%.*]])
anatofuz
parents:
diff changeset
399 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i8, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
400 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
401 ; CHECK-NEXT: store i8 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
402 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
403 ;
anatofuz
parents:
diff changeset
404 %s = sub i8 42, %x
anatofuz
parents:
diff changeset
405 %ov = icmp ugt i8 %x, 42
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
406 store i8 %s, ptr %p
150
anatofuz
parents:
diff changeset
407 ret i1 %ov
anatofuz
parents:
diff changeset
408 }
anatofuz
parents:
diff changeset
409
anatofuz
parents:
diff changeset
410 ; Compare with constant operand 0 is canonicalized by commuting, but verify match for non-canonical form.
anatofuz
parents:
diff changeset
411
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
412 define i1 @usubo_ult_constant_op0_i16(i16 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
413 ; CHECK-LABEL: @usubo_ult_constant_op0_i16(
anatofuz
parents:
diff changeset
414 ; CHECK-NEXT: [[TMP1:%.*]] = call { i16, i1 } @llvm.usub.with.overflow.i16(i16 43, i16 [[X:%.*]])
anatofuz
parents:
diff changeset
415 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i16, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
416 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
417 ; CHECK-NEXT: store i16 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
418 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
419 ;
anatofuz
parents:
diff changeset
420 %s = sub i16 43, %x
anatofuz
parents:
diff changeset
421 %ov = icmp ult i16 43, %x
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
422 store i16 %s, ptr %p
150
anatofuz
parents:
diff changeset
423 ret i1 %ov
anatofuz
parents:
diff changeset
424 }
anatofuz
parents:
diff changeset
425
anatofuz
parents:
diff changeset
426 ; Subtract with constant operand 1 is canonicalized to add.
anatofuz
parents:
diff changeset
427
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
428 define i1 @usubo_ult_constant_op1_i16(i16 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
429 ; CHECK-LABEL: @usubo_ult_constant_op1_i16(
anatofuz
parents:
diff changeset
430 ; CHECK-NEXT: [[TMP1:%.*]] = call { i16, i1 } @llvm.usub.with.overflow.i16(i16 [[X:%.*]], i16 44)
anatofuz
parents:
diff changeset
431 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i16, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
432 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i16, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
433 ; CHECK-NEXT: store i16 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
434 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
435 ;
anatofuz
parents:
diff changeset
436 %s = add i16 %x, -44
anatofuz
parents:
diff changeset
437 %ov = icmp ult i16 %x, 44
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
438 store i16 %s, ptr %p
150
anatofuz
parents:
diff changeset
439 ret i1 %ov
anatofuz
parents:
diff changeset
440 }
anatofuz
parents:
diff changeset
441
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
442 define i1 @usubo_ugt_constant_op1_i8(i8 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
443 ; CHECK-LABEL: @usubo_ugt_constant_op1_i8(
anatofuz
parents:
diff changeset
444 ; CHECK-NEXT: [[TMP1:%.*]] = call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[X:%.*]], i8 45)
anatofuz
parents:
diff changeset
445 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i8, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
446 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i8, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
447 ; CHECK-NEXT: store i8 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
448 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
449 ;
anatofuz
parents:
diff changeset
450 %ov = icmp ugt i8 45, %x
anatofuz
parents:
diff changeset
451 %s = add i8 %x, -45
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
452 store i8 %s, ptr %p
150
anatofuz
parents:
diff changeset
453 ret i1 %ov
anatofuz
parents:
diff changeset
454 }
anatofuz
parents:
diff changeset
455
anatofuz
parents:
diff changeset
456 ; Special-case: subtract 1 changes the compare predicate and constant.
anatofuz
parents:
diff changeset
457
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
458 define i1 @usubo_eq_constant1_op1_i32(i32 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
459 ; CHECK-LABEL: @usubo_eq_constant1_op1_i32(
anatofuz
parents:
diff changeset
460 ; CHECK-NEXT: [[TMP1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[X:%.*]], i32 1)
anatofuz
parents:
diff changeset
461 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i32, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
462 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
463 ; CHECK-NEXT: store i32 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
464 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
465 ;
anatofuz
parents:
diff changeset
466 %s = add i32 %x, -1
anatofuz
parents:
diff changeset
467 %ov = icmp eq i32 %x, 0
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
468 store i32 %s, ptr %p
150
anatofuz
parents:
diff changeset
469 ret i1 %ov
anatofuz
parents:
diff changeset
470 }
anatofuz
parents:
diff changeset
471
anatofuz
parents:
diff changeset
472 ; Special-case: subtract from 0 (negate) changes the compare predicate.
anatofuz
parents:
diff changeset
473
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
474 define i1 @usubo_ne_constant0_op1_i32(i32 %x, ptr %p) {
150
anatofuz
parents:
diff changeset
475 ; CHECK-LABEL: @usubo_ne_constant0_op1_i32(
anatofuz
parents:
diff changeset
476 ; CHECK-NEXT: [[TMP1:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 0, i32 [[X:%.*]])
anatofuz
parents:
diff changeset
477 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i32, i1 } [[TMP1]], 0
anatofuz
parents:
diff changeset
478 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i32, i1 } [[TMP1]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
479 ; CHECK-NEXT: store i32 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
480 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
481 ;
anatofuz
parents:
diff changeset
482 %s = sub i32 0, %x
anatofuz
parents:
diff changeset
483 %ov = icmp ne i32 %x, 0
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
484 store i32 %s, ptr %p
150
anatofuz
parents:
diff changeset
485 ret i1 %ov
anatofuz
parents:
diff changeset
486 }
anatofuz
parents:
diff changeset
487
anatofuz
parents:
diff changeset
488 ; This used to verify insertion point for multi-BB, but now we just bail out.
anatofuz
parents:
diff changeset
489
anatofuz
parents:
diff changeset
490 declare void @call(i1)
anatofuz
parents:
diff changeset
491
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
492 define i1 @usubo_ult_sub_dominates_i64(i64 %x, i64 %y, ptr %p, i1 %cond) {
150
anatofuz
parents:
diff changeset
493 ; CHECK-LABEL: @usubo_ult_sub_dominates_i64(
anatofuz
parents:
diff changeset
494 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
495 ; CHECK-NEXT: br i1 [[COND:%.*]], label [[T:%.*]], label [[F:%.*]]
anatofuz
parents:
diff changeset
496 ; CHECK: t:
anatofuz
parents:
diff changeset
497 ; CHECK-NEXT: [[S:%.*]] = sub i64 [[X:%.*]], [[Y:%.*]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
498 ; CHECK-NEXT: store i64 [[S]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
499 ; CHECK-NEXT: br i1 [[COND]], label [[END:%.*]], label [[F]]
anatofuz
parents:
diff changeset
500 ; CHECK: f:
anatofuz
parents:
diff changeset
501 ; CHECK-NEXT: ret i1 [[COND]]
anatofuz
parents:
diff changeset
502 ; CHECK: end:
anatofuz
parents:
diff changeset
503 ; CHECK-NEXT: [[OV:%.*]] = icmp ult i64 [[X]], [[Y]]
anatofuz
parents:
diff changeset
504 ; CHECK-NEXT: ret i1 [[OV]]
anatofuz
parents:
diff changeset
505 ;
anatofuz
parents:
diff changeset
506 entry:
anatofuz
parents:
diff changeset
507 br i1 %cond, label %t, label %f
anatofuz
parents:
diff changeset
508
anatofuz
parents:
diff changeset
509 t:
anatofuz
parents:
diff changeset
510 %s = sub i64 %x, %y
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
511 store i64 %s, ptr %p
150
anatofuz
parents:
diff changeset
512 br i1 %cond, label %end, label %f
anatofuz
parents:
diff changeset
513
anatofuz
parents:
diff changeset
514 f:
anatofuz
parents:
diff changeset
515 ret i1 %cond
anatofuz
parents:
diff changeset
516
anatofuz
parents:
diff changeset
517 end:
anatofuz
parents:
diff changeset
518 %ov = icmp ult i64 %x, %y
anatofuz
parents:
diff changeset
519 ret i1 %ov
anatofuz
parents:
diff changeset
520 }
anatofuz
parents:
diff changeset
521
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
522 define i1 @usubo_ult_cmp_dominates_i64(i64 %x, i64 %y, ptr %p, i1 %cond) {
150
anatofuz
parents:
diff changeset
523 ; CHECK-LABEL: @usubo_ult_cmp_dominates_i64(
anatofuz
parents:
diff changeset
524 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
525 ; CHECK-NEXT: br i1 [[COND:%.*]], label [[T:%.*]], label [[F:%.*]]
anatofuz
parents:
diff changeset
526 ; CHECK: t:
anatofuz
parents:
diff changeset
527 ; CHECK-NEXT: [[OV:%.*]] = icmp ult i64 [[X:%.*]], [[Y:%.*]]
anatofuz
parents:
diff changeset
528 ; CHECK-NEXT: call void @call(i1 [[OV]])
anatofuz
parents:
diff changeset
529 ; CHECK-NEXT: br i1 [[OV]], label [[END:%.*]], label [[F]]
anatofuz
parents:
diff changeset
530 ; CHECK: f:
anatofuz
parents:
diff changeset
531 ; CHECK-NEXT: ret i1 [[COND]]
anatofuz
parents:
diff changeset
532 ; CHECK: end:
anatofuz
parents:
diff changeset
533 ; CHECK-NEXT: [[TMP0:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[X]], i64 [[Y]])
anatofuz
parents:
diff changeset
534 ; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP0]], 0
anatofuz
parents:
diff changeset
535 ; CHECK-NEXT: [[OV1:%.*]] = extractvalue { i64, i1 } [[TMP0]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
536 ; CHECK-NEXT: store i64 [[MATH]], ptr [[P:%.*]]
150
anatofuz
parents:
diff changeset
537 ; CHECK-NEXT: ret i1 [[OV1]]
anatofuz
parents:
diff changeset
538 ;
anatofuz
parents:
diff changeset
539 entry:
anatofuz
parents:
diff changeset
540 br i1 %cond, label %t, label %f
anatofuz
parents:
diff changeset
541
anatofuz
parents:
diff changeset
542 t:
anatofuz
parents:
diff changeset
543 %ov = icmp ult i64 %x, %y
anatofuz
parents:
diff changeset
544 call void @call(i1 %ov)
anatofuz
parents:
diff changeset
545 br i1 %ov, label %end, label %f
anatofuz
parents:
diff changeset
546
anatofuz
parents:
diff changeset
547 f:
anatofuz
parents:
diff changeset
548 ret i1 %cond
anatofuz
parents:
diff changeset
549
anatofuz
parents:
diff changeset
550 end:
anatofuz
parents:
diff changeset
551 %s = sub i64 %x, %y
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
552 store i64 %s, ptr %p
150
anatofuz
parents:
diff changeset
553 ret i1 %ov
anatofuz
parents:
diff changeset
554 }
anatofuz
parents:
diff changeset
555
anatofuz
parents:
diff changeset
556 ; Verify that crazy/non-canonical code does not crash.
anatofuz
parents:
diff changeset
557
anatofuz
parents:
diff changeset
558 define void @bar() {
anatofuz
parents:
diff changeset
559 ; CHECK-LABEL: @bar(
anatofuz
parents:
diff changeset
560 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 1, -1
anatofuz
parents:
diff changeset
561 ; CHECK-NEXT: [[FROMBOOL:%.*]] = zext i1 [[CMP]] to i8
anatofuz
parents:
diff changeset
562 ; CHECK-NEXT: unreachable
anatofuz
parents:
diff changeset
563 ;
anatofuz
parents:
diff changeset
564 %cmp = icmp eq i64 1, -1
anatofuz
parents:
diff changeset
565 %frombool = zext i1 %cmp to i8
anatofuz
parents:
diff changeset
566 unreachable
anatofuz
parents:
diff changeset
567 }
anatofuz
parents:
diff changeset
568
anatofuz
parents:
diff changeset
569 define void @foo() {
anatofuz
parents:
diff changeset
570 ; CHECK-LABEL: @foo(
anatofuz
parents:
diff changeset
571 ; CHECK-NEXT: [[SUB:%.*]] = add nsw i64 1, 1
anatofuz
parents:
diff changeset
572 ; CHECK-NEXT: [[CONV:%.*]] = trunc i64 [[SUB]] to i32
anatofuz
parents:
diff changeset
573 ; CHECK-NEXT: unreachable
anatofuz
parents:
diff changeset
574 ;
anatofuz
parents:
diff changeset
575 %sub = add nsw i64 1, 1
anatofuz
parents:
diff changeset
576 %conv = trunc i64 %sub to i32
anatofuz
parents:
diff changeset
577 unreachable
anatofuz
parents:
diff changeset
578 }
anatofuz
parents:
diff changeset
579
anatofuz
parents:
diff changeset
580 ; Similarly for usubo.
anatofuz
parents:
diff changeset
581
anatofuz
parents:
diff changeset
582 define i1 @bar2() {
anatofuz
parents:
diff changeset
583 ; CHECK-LABEL: @bar2(
anatofuz
parents:
diff changeset
584 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 1, 0
anatofuz
parents:
diff changeset
585 ; CHECK-NEXT: ret i1 [[CMP]]
anatofuz
parents:
diff changeset
586 ;
anatofuz
parents:
diff changeset
587 %cmp = icmp eq i64 1, 0
anatofuz
parents:
diff changeset
588 ret i1 %cmp
anatofuz
parents:
diff changeset
589 }
anatofuz
parents:
diff changeset
590
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
591 define i64 @foo2(ptr %p) {
150
anatofuz
parents:
diff changeset
592 ; CHECK-LABEL: @foo2(
anatofuz
parents:
diff changeset
593 ; CHECK-NEXT: [[SUB:%.*]] = add nsw i64 1, -1
anatofuz
parents:
diff changeset
594 ; CHECK-NEXT: ret i64 [[SUB]]
anatofuz
parents:
diff changeset
595 ;
anatofuz
parents:
diff changeset
596 %sub = add nsw i64 1, -1
anatofuz
parents:
diff changeset
597 ret i64 %sub
anatofuz
parents:
diff changeset
598 }
anatofuz
parents:
diff changeset
599
anatofuz
parents:
diff changeset
600 ; Avoid hoisting a math op into a dominating block which would
anatofuz
parents:
diff changeset
601 ; increase the critical path.
anatofuz
parents:
diff changeset
602
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
603 define void @PR41129(ptr %p64) {
150
anatofuz
parents:
diff changeset
604 ; CHECK-LABEL: @PR41129(
anatofuz
parents:
diff changeset
605 ; CHECK-NEXT: entry:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
606 ; CHECK-NEXT: [[KEY:%.*]] = load i64, ptr [[P64:%.*]], align 8
150
anatofuz
parents:
diff changeset
607 ; CHECK-NEXT: [[COND17:%.*]] = icmp eq i64 [[KEY]], 0
anatofuz
parents:
diff changeset
608 ; CHECK-NEXT: br i1 [[COND17]], label [[TRUE:%.*]], label [[FALSE:%.*]]
anatofuz
parents:
diff changeset
609 ; CHECK: false:
anatofuz
parents:
diff changeset
610 ; CHECK-NEXT: [[ANDVAL:%.*]] = and i64 [[KEY]], 7
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
611 ; CHECK-NEXT: store i64 [[ANDVAL]], ptr [[P64]]
150
anatofuz
parents:
diff changeset
612 ; CHECK-NEXT: br label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
613 ; CHECK: true:
anatofuz
parents:
diff changeset
614 ; CHECK-NEXT: [[SVALUE:%.*]] = add i64 [[KEY]], -1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
615 ; CHECK-NEXT: store i64 [[SVALUE]], ptr [[P64]]
150
anatofuz
parents:
diff changeset
616 ; CHECK-NEXT: br label [[EXIT]]
anatofuz
parents:
diff changeset
617 ; CHECK: exit:
anatofuz
parents:
diff changeset
618 ; CHECK-NEXT: ret void
anatofuz
parents:
diff changeset
619 ;
anatofuz
parents:
diff changeset
620 entry:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
621 %key = load i64, ptr %p64, align 8
150
anatofuz
parents:
diff changeset
622 %cond17 = icmp eq i64 %key, 0
anatofuz
parents:
diff changeset
623 br i1 %cond17, label %true, label %false
anatofuz
parents:
diff changeset
624
anatofuz
parents:
diff changeset
625 false:
anatofuz
parents:
diff changeset
626 %andval = and i64 %key, 7
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
627 store i64 %andval, ptr %p64
150
anatofuz
parents:
diff changeset
628 br label %exit
anatofuz
parents:
diff changeset
629
anatofuz
parents:
diff changeset
630 true:
anatofuz
parents:
diff changeset
631 %svalue = add i64 %key, -1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
632 store i64 %svalue, ptr %p64
150
anatofuz
parents:
diff changeset
633 br label %exit
anatofuz
parents:
diff changeset
634
anatofuz
parents:
diff changeset
635 exit:
anatofuz
parents:
diff changeset
636 ret void
anatofuz
parents:
diff changeset
637 }
anatofuz
parents:
diff changeset
638
anatofuz
parents:
diff changeset
639 ; Check that every instruction inserted by -codegenprepare has a debug location.
anatofuz
parents:
diff changeset
640 ; DEBUG: CheckModuleDebugify: PASS
anatofuz
parents:
diff changeset
641