[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / ARM / smml.ll
blob712aaa4392f60fe90858f1affb2bd95ea1a87a9a
1 ; RUN: llc -mtriple=arm-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-V4
2 ; RUN: llc -mtriple=armv6-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-V6
3 ; RUN: llc -mtriple=armv7-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-V6
4 ; RUN: llc -mtriple=thumb-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-THUMB
5 ; RUN: llc -mtriple=thumbv6-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-THUMB
6 ; RUN: llc -mtriple=thumbv6t2-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-THUMBV6T2
7 ; RUN: llc -mtriple=thumbv7-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-THUMBV6T2
8 ; RUN: llc -mtriple=thumbv7m-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-V4
9 ; RUN: llc -mtriple=thumbv7em-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-THUMBV6T2
11 ; Next test would previously trigger an assertion responsible for verification of
12 ; call site info state.
13 ; RUN: llc -stop-after=if-converter -debug-entry-values -mtriple=thumbv6t2-eabi %s -o -| FileCheck %s -check-prefix=CHECK-CALLSITE
14 ; CHECK-CALLSITE: name:  test_used_flags
15 ; CHECK-CALLSITE: callSites:
18 define i32 @Test0(i32 %a, i32 %b, i32 %c) nounwind readnone ssp {
19 entry:
20 ; CHECK-LABEL: Test0
21 ; CHECK-NOT: smmls
22   %conv4 = zext i32 %a to i64
23   %conv1 = sext i32 %b to i64
24   %conv2 = sext i32 %c to i64
25   %mul = mul nsw i64 %conv2, %conv1
26   %shr5 = lshr i64 %mul, 32
27   %sub = sub nsw i64 %conv4, %shr5
28   %conv3 = trunc i64 %sub to i32
29   ret i32 %conv3
32 define i32 @Test1(i32 %a, i32 %b, i32 %c) {
33 ;CHECK-LABEL: Test1
34 ;CHECK-V4-NOT: smmls
35 ;CHECK-THUMB-NOT: smmls
36 ;CHECK-V6: smmls r0, [[Rn:r[1-2]]], [[Rm:r[1-2]]], r0
37 ;CHECK-THUMBV6T2: smmls r0, [[Rn:r[1-2]]], [[Rm:r[1-2]]], r0
38 entry:
39   %conv = sext i32 %b to i64
40   %conv1 = sext i32 %c to i64
41   %mul = mul nsw i64 %conv1, %conv
42   %conv26 = zext i32 %a to i64
43   %shl = shl nuw i64 %conv26, 32
44   %sub = sub nsw i64 %shl, %mul
45   %shr7 = lshr i64 %sub, 32
46   %conv3 = trunc i64 %shr7 to i32
47   ret i32 %conv3
50 declare void @opaque(i32)
51 define void @test_used_flags(i32 %in1, i32 %in2) {
52 ; CHECK-LABEL: test_used_flags:
53 ; CHECK-THUMB: movs    r2, #0
54 ; CHECK-THUMB: rsbs    r0, r0, #0
55 ; CHECK-THUMB: sbcs    r2, r1
56 ; CHECK-THUMB: bge
57 ; CHECK-V6: smull [[PROD_LO:r[0-9]+]], [[PROD_HI:r[0-9]+]], r0, r1
58 ; CHECK-V6: rsbs {{.*}}, [[PROD_LO]], #0
59 ; CHECK-V6: rscs {{.*}}, [[PROD_HI]], #0
60 ; CHECK-THUMBV6T2: smull [[PROD_LO:r[0-9]+]], [[PROD_HI:r[0-9]+]], r0, r1
61 ; CHECK-THUMBV6T2: movs [[ZERO:r[0-9]+]], #0
62 ; CHECK-THUMBV6T2: rsbs {{.*}}, [[PROD_LO]], #0
63 ; CHECK-THUMBV6T2: sbcs.w {{.*}}, [[ZERO]], [[PROD_HI]]
64   %in1.64 = sext i32 %in1 to i64
65   %in2.64 = sext i32 %in2 to i64
66   %mul = mul nsw i64 %in1.64, %in2.64
67   %tst = icmp slt i64 %mul, 1
68   br i1 %tst, label %true, label %false
70 true:
71   call void @opaque(i32 42)
72   ret void
74 false:
75   call void @opaque(i32 56)
76   ret void