xref: /llvm-project/llvm/test/Transforms/CodeGenPrepare/ARM/overflow-intrinsics.ll (revision f1ec0d12bb0843f0deab83ef2b5cf1339cbc4f0b)
1; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -S < %s | FileCheck %s
2
3target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4target triple = "thumbv8m.main-arm-none-eabi"
5
6; CHECK-LABEL: uadd_overflow_too_far_cmp_dom
7; CHECK-NOT: with.overflow.i32
8define i32 @uadd_overflow_too_far_cmp_dom(i32 %arg0) {
9entry:
10  %cmp = icmp ne i32 %arg0, 0
11  br i1 %cmp, label %if.else, label %if.then
12
13if.then:
14  call void @foo()
15  br label %exit
16
17if.else:
18  call void @bar()
19  br label %if.end
20
21if.end:
22  %dec = add nsw i32 %arg0, -1
23  br label %exit
24
25exit:
26  %res = phi i32 [ %arg0, %if.then ], [ %dec, %if.end ]
27  ret i32 %res
28}
29
30; CHECK-LABEL: uadd_overflow_too_far_math_dom
31; CHECK-NOT: with.overflow.i32
32define i32 @uadd_overflow_too_far_math_dom(i32 %arg0, i32 %arg1) {
33entry:
34  %dec = add nsw i32 %arg0, -1
35  %cmp = icmp ugt i32 %arg0, 1
36  br i1 %cmp, label %if.else, label %if.then
37
38if.then:
39  call void @foo()
40  br label %if.end
41
42if.else:
43  call void @bar()
44  br label %if.end
45
46if.end:
47  %cmp.i.i = icmp ne i32 %arg0, 0
48  %tobool = zext i1 %cmp.i.i to i32
49  br label %exit
50
51exit:
52  ret i32 %tobool
53}
54
55declare void @foo()
56declare void @bar()
57