[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AArch64 / arm64-cse.ll
blob36aa036c3c0fa678bd2c3fbbddbdcf349ab4c56e
1 ; RUN: llc -O3 < %s -aarch64-enable-atomic-cfg-tidy=0 -aarch64-enable-gep-opt=false -verify-machineinstrs | FileCheck %s
2 target triple = "arm64-apple-ios"
4 ; rdar://12462006
5 ; CSE between "icmp reg reg" and "sub reg reg".
6 ; Both can be in the same basic block or in different basic blocks.
7 define i8* @t1(i8* %base, i32* nocapture %offset, i32 %size) nounwind {
8 entry:
9 ; CHECK-LABEL: t1:
10 ; CHECK: subs
11 ; CHECK-NOT: cmp
12 ; CHECK-NOT: sub
13 ; CHECK: b.ge
14 ; CHECK: sub
15 ; CHECK-NEXT: add
16 ; CHECK-NOT: sub
17 ; CHECK: ret
18  %0 = load i32, i32* %offset, align 4
19  %cmp = icmp slt i32 %0, %size
20  %s = sub nsw i32 %0, %size
21  br i1 %cmp, label %return, label %if.end
23 if.end:
24  %sub = sub nsw i32 %0, %size
25  %s2 = sub nsw i32 %s, %size
26  %s3 = sub nsw i32 %sub, %s2
27  store i32 %s3, i32* %offset, align 4
28  %add.ptr = getelementptr inbounds i8, i8* %base, i32 %sub
29  br label %return
31 return:
32  %retval.0 = phi i8* [ %add.ptr, %if.end ], [ null, %entry ]
33  ret i8* %retval.0
36 ; CSE between "icmp reg imm" and "sub reg imm".
37 define i8* @t2(i8* %base, i32* nocapture %offset) nounwind {
38 entry:
39 ; CHECK-LABEL: t2:
40 ; CHECK: subs
41 ; CHECK-NOT: cmp
42 ; CHECK-NOT: sub
43 ; CHECK: b.lt
44 ; CHECK-NOT: sub
45 ; CHECK: ret
46  %0 = load i32, i32* %offset, align 4
47  %cmp = icmp slt i32 %0, 1
48  br i1 %cmp, label %return, label %if.end
50 if.end:
51  %sub = sub nsw i32 %0, 1
52  store i32 %sub, i32* %offset, align 4
53  %add.ptr = getelementptr inbounds i8, i8* %base, i32 %sub
54  br label %return
56 return:
57  %retval.0 = phi i8* [ %add.ptr, %if.end ], [ null, %entry ]
58  ret i8* %retval.0