1
1
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2
- ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix= SSE
3
- ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix= AVX
2
+ ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=CHECK, SSE
3
+ ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK, AVX
4
4
5
5
; fold (add x, 0) -> x
6
6
define <4 x i32 > @combine_vec_add_to_zero (<4 x i32 > %a ) {
7
- ; SSE-LABEL: combine_vec_add_to_zero:
8
- ; SSE: # %bb.0:
9
- ; SSE-NEXT: retq
10
- ;
11
- ; AVX-LABEL: combine_vec_add_to_zero:
12
- ; AVX: # %bb.0:
13
- ; AVX-NEXT: retq
7
+ ; CHECK-LABEL: combine_vec_add_to_zero:
8
+ ; CHECK: # %bb.0:
9
+ ; CHECK-NEXT: retq
14
10
%1 = add <4 x i32 > %a , zeroinitializer
15
11
ret <4 x i32 > %1
16
12
}
@@ -352,17 +348,11 @@ define <4 x i32> @combine_vec_add_sextinreg(<4 x i32> %a0, <4 x i32> %a1) {
352
348
353
349
; (add (add (xor a, -1), b), 1) -> (sub b, a)
354
350
define i32 @combine_add_add_not (i32 %a , i32 %b ) {
355
- ; SSE-LABEL: combine_add_add_not:
356
- ; SSE: # %bb.0:
357
- ; SSE-NEXT: movl %esi, %eax
358
- ; SSE-NEXT: subl %edi, %eax
359
- ; SSE-NEXT: retq
360
- ;
361
- ; AVX-LABEL: combine_add_add_not:
362
- ; AVX: # %bb.0:
363
- ; AVX-NEXT: movl %esi, %eax
364
- ; AVX-NEXT: subl %edi, %eax
365
- ; AVX-NEXT: retq
351
+ ; CHECK-LABEL: combine_add_add_not:
352
+ ; CHECK: # %bb.0:
353
+ ; CHECK-NEXT: movl %esi, %eax
354
+ ; CHECK-NEXT: subl %edi, %eax
355
+ ; CHECK-NEXT: retq
366
356
%nota = xor i32 %a , -1
367
357
%add = add i32 %nota , %b
368
358
%r = add i32 %add , 1
@@ -385,3 +375,45 @@ define <4 x i32> @combine_vec_add_add_not(<4 x i32> %a, <4 x i32> %b) {
385
375
%r = add <4 x i32 > %add , <i32 1 , i32 1 , i32 1 , i32 1 >
386
376
ret <4 x i32 > %r
387
377
}
378
+
379
+ declare {i32 , i1 } @llvm.sadd.with.overflow.i32 (i32 %a , i32 %b )
380
+
381
+ define i1 @sadd_add (i32 %a , i32 %b , i32* %p ) {
382
+ ; CHECK-LABEL: sadd_add:
383
+ ; CHECK: # %bb.0:
384
+ ; CHECK-NEXT: movl %edi, %eax
385
+ ; CHECK-NEXT: notl %eax
386
+ ; CHECK-NEXT: addl %esi, %eax
387
+ ; CHECK-NEXT: seto %al
388
+ ; CHECK-NEXT: subl %edi, %esi
389
+ ; CHECK-NEXT: movl %esi, (%rdx)
390
+ ; CHECK-NEXT: retq
391
+ %nota = xor i32 %a , -1
392
+ %a0 = call {i32 , i1 } @llvm.sadd.with.overflow.i32 (i32 %nota , i32 %b )
393
+ %e0 = extractvalue {i32 , i1 } %a0 , 0
394
+ %e1 = extractvalue {i32 , i1 } %a0 , 1
395
+ %res = add i32 %e0 , 1
396
+ store i32 %res , i32* %p
397
+ ret i1 %e1
398
+ }
399
+
400
+ declare {i8 , i1 } @llvm.uadd.with.overflow.i8 (i8 %a , i8 %b )
401
+
402
+ define i1 @uadd_add (i8 %a , i8 %b , i8* %p ) {
403
+ ; CHECK-LABEL: uadd_add:
404
+ ; CHECK: # %bb.0:
405
+ ; CHECK-NEXT: movl %edi, %eax
406
+ ; CHECK-NEXT: notb %al
407
+ ; CHECK-NEXT: addb %sil, %al
408
+ ; CHECK-NEXT: setb %al
409
+ ; CHECK-NEXT: subb %dil, %sil
410
+ ; CHECK-NEXT: movb %sil, (%rdx)
411
+ ; CHECK-NEXT: retq
412
+ %nota = xor i8 %a , -1
413
+ %a0 = call {i8 , i1 } @llvm.uadd.with.overflow.i8 (i8 %nota , i8 %b )
414
+ %e0 = extractvalue {i8 , i1 } %a0 , 0
415
+ %e1 = extractvalue {i8 , i1 } %a0 , 1
416
+ %res = add i8 %e0 , 1
417
+ store i8 %res , i8* %p
418
+ ret i1 %e1
419
+ }
0 commit comments