Skip to content

Commit 5b16cd9

Browse files
committed
[SCCP] Add extra tests for Add flag inference.
Add extra tests from #60280 and #60278 as well as test showing missed optimization opportunity.
1 parent 024e4f1 commit 5b16cd9

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

llvm/test/Transforms/SCCP/add-nuw-nsw-flags.ll

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,78 @@ else:
117117
%res.6 = xor i8 %res.5, %add.8
118118
ret i8 %res.6
119119
}
120+
121+
define i16 @sge_with_sext_to_zext_conversion(i8 %a) {
122+
; CHECK-LABEL: @sge_with_sext_to_zext_conversion(
123+
; CHECK-NEXT: entry:
124+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[A:%.*]], 0
125+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
126+
; CHECK: then:
127+
; CHECK-NEXT: [[SEXT:%.*]] = zext i8 [[A]] to i16
128+
; CHECK-NEXT: [[ADD_1:%.*]] = add i16 [[SEXT]], 1
129+
; CHECK-NEXT: [[ADD_2:%.*]] = add i16 [[SEXT]], -128
130+
; CHECK-NEXT: [[ADD_3:%.*]] = add i16 [[SEXT]], -127
131+
; CHECK-NEXT: [[RES_1:%.*]] = xor i16 [[ADD_1]], [[ADD_2]]
132+
; CHECK-NEXT: [[RES_2:%.*]] = xor i16 [[RES_1]], [[ADD_3]]
133+
; CHECK-NEXT: ret i16 [[RES_2]]
134+
; CHECK: else:
135+
; CHECK-NEXT: [[SEXT_2:%.*]] = sext i8 [[A]] to i16
136+
; CHECK-NEXT: [[ADD_4:%.*]] = add i16 [[SEXT_2]], 1
137+
; CHECK-NEXT: [[ADD_5:%.*]] = add i16 [[SEXT_2]], -128
138+
; CHECK-NEXT: [[ADD_6:%.*]] = add i16 [[SEXT_2]], -127
139+
; CHECK-NEXT: [[RES_3:%.*]] = xor i16 [[ADD_4]], [[ADD_5]]
140+
; CHECK-NEXT: [[RES_4:%.*]] = xor i16 [[RES_3]], [[ADD_6]]
141+
; CHECK-NEXT: ret i16 [[RES_4]]
142+
;
143+
entry:
144+
%cmp = icmp sgt i8 %a, 0
145+
br i1 %cmp, label %then, label %else
146+
147+
then:
148+
%sext = sext i8 %a to i16
149+
%add.1 = add i16 %sext, 1
150+
%add.2 = add i16 %sext, 65408
151+
%add.3 = add i16 %sext, 65409
152+
%res.1 = xor i16 %add.1, %add.2
153+
%res.2 = xor i16 %res.1, %add.3
154+
ret i16 %res.2
155+
156+
else:
157+
%sext.2 = sext i8 %a to i16
158+
%add.4 = add i16 %sext.2, 1
159+
%add.5 = add i16 %sext.2, 65408
160+
%add.6 = add i16 %sext.2, 65409
161+
%res.3 = xor i16 %add.4, %add.5
162+
%res.4 = xor i16 %res.3, %add.6
163+
ret i16 %res.4
164+
}
165+
166+
@c = internal global <6 x i8> zeroinitializer, align 8
167+
168+
; Test case for PR60280.
169+
define <6 x i8> @vector_constant_replacement_in_add(<6 x i8> %a) {
170+
; CHECK-LABEL: @vector_constant_replacement_in_add(
171+
; CHECK-NEXT: entry:
172+
; CHECK-NEXT: [[ADD:%.*]] = add <6 x i8> [[A:%.*]], zeroinitializer
173+
; CHECK-NEXT: ret <6 x i8> [[ADD]]
174+
;
175+
entry:
176+
%c = load <6 x i8>, ptr @c, align 8
177+
%add = add <6 x i8> %a, %c
178+
ret <6 x i8> %add
179+
}
180+
181+
declare i32 @callee()
182+
183+
; Test case for PR60278.
184+
define i64 @constant_ptrtoint_replacement(i64 %a) {
185+
; CHECK-LABEL: @constant_ptrtoint_replacement(
186+
; CHECK-NEXT: entry:
187+
; CHECK-NEXT: [[RES:%.*]] = add i64 [[A:%.*]], ptrtoint (ptr @callee to i64)
188+
; CHECK-NEXT: ret i64 [[RES]]
189+
;
190+
entry:
191+
%fn.addr = ptrtoint ptr @callee to i64
192+
%res = add i64 %a, %fn.addr
193+
ret i64 %res
194+
}

0 commit comments

Comments
 (0)