xref: /llvm-project/llvm/test/Transforms/CodeGenPrepare/SPARC/overflow-intrinsics.ll (revision f1ec0d12bb0843f0deab83ef2b5cf1339cbc4f0b)
1106ae108SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*f1ec0d12SNick Anderson; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -S < %s | FileCheck %s
3*f1ec0d12SNick Anderson; RUN: opt -enable-debugify -passes='require<profile-summary>,function(codegenprepare)' -S < %s 2>&1 | FileCheck %s -check-prefix=DEBUG
4106ae108SFlorian Hahn
5106ae108SFlorian Hahn; Subset of tests from llvm/tests/Transforms/CodeGenPrepare/X86/overflow-intrinsics.ll
6106ae108SFlorian Hahn; to test shouldFormOverflowOp on SPARC, where it is not profitable to create
7106ae108SFlorian Hahn; overflow intrinsics if the math part is not used.
8106ae108SFlorian Hahn
9106ae108SFlorian Hahntarget triple = "sparc64-unknown-linux"
10106ae108SFlorian Hahn
11106ae108SFlorian Hahndefine i64 @uaddo1_overflow_used(i64 %a, i64 %b) nounwind ssp {
12106ae108SFlorian Hahn; CHECK-LABEL: @uaddo1_overflow_used(
13216afd33SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i64 [[B:%.*]], [[A:%.*]]
14216afd33SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[ADD]], [[A]]
15216afd33SFlorian Hahn; CHECK-NEXT:    [[Q:%.*]] = select i1 [[CMP]], i64 [[B]], i64 42
16106ae108SFlorian Hahn; CHECK-NEXT:    ret i64 [[Q]]
17106ae108SFlorian Hahn;
18106ae108SFlorian Hahn  %add = add i64 %b, %a
19106ae108SFlorian Hahn  %cmp = icmp ult i64 %add, %a
20106ae108SFlorian Hahn  %Q = select i1 %cmp, i64 %b, i64 42
21106ae108SFlorian Hahn  ret i64 %Q
22106ae108SFlorian Hahn}
23106ae108SFlorian Hahn
24d9e51e75SMatt Arsenaultdefine i64 @uaddo1_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {
25106ae108SFlorian Hahn; CHECK-LABEL: @uaddo1_math_overflow_used(
26106ae108SFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])
27106ae108SFlorian Hahn; CHECK-NEXT:    [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
28106ae108SFlorian Hahn; CHECK-NEXT:    [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
29106ae108SFlorian Hahn; CHECK-NEXT:    [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42
30d9e51e75SMatt Arsenault; CHECK-NEXT:    store i64 [[MATH]], ptr [[RES:%.*]]
31106ae108SFlorian Hahn; CHECK-NEXT:    ret i64 [[Q]]
32106ae108SFlorian Hahn;
33106ae108SFlorian Hahn  %add = add i64 %b, %a
34106ae108SFlorian Hahn  %cmp = icmp ult i64 %add, %a
35106ae108SFlorian Hahn  %Q = select i1 %cmp, i64 %b, i64 42
36d9e51e75SMatt Arsenault  store i64 %add, ptr %res
37106ae108SFlorian Hahn  ret i64 %Q
38106ae108SFlorian Hahn}
39106ae108SFlorian Hahn
40106ae108SFlorian Hahndefine i64 @uaddo2_overflow_used(i64 %a, i64 %b) nounwind ssp {
41106ae108SFlorian Hahn; CHECK-LABEL: @uaddo2_overflow_used(
42216afd33SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i64 [[B:%.*]], [[A:%.*]]
43216afd33SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[ADD]], [[B]]
44216afd33SFlorian Hahn; CHECK-NEXT:    [[Q:%.*]] = select i1 [[CMP]], i64 [[B]], i64 42
45106ae108SFlorian Hahn; CHECK-NEXT:    ret i64 [[Q]]
46106ae108SFlorian Hahn;
47106ae108SFlorian Hahn  %add = add i64 %b, %a
48106ae108SFlorian Hahn  %cmp = icmp ult i64 %add, %b
49106ae108SFlorian Hahn  %Q = select i1 %cmp, i64 %b, i64 42
50106ae108SFlorian Hahn  ret i64 %Q
51106ae108SFlorian Hahn}
52106ae108SFlorian Hahn
53d9e51e75SMatt Arsenaultdefine i64 @uaddo2_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {
54106ae108SFlorian Hahn; CHECK-LABEL: @uaddo2_math_overflow_used(
55106ae108SFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])
56106ae108SFlorian Hahn; CHECK-NEXT:    [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
57106ae108SFlorian Hahn; CHECK-NEXT:    [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
58106ae108SFlorian Hahn; CHECK-NEXT:    [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42
59d9e51e75SMatt Arsenault; CHECK-NEXT:    store i64 [[MATH]], ptr [[RES:%.*]]
60106ae108SFlorian Hahn; CHECK-NEXT:    ret i64 [[Q]]
61106ae108SFlorian Hahn;
62106ae108SFlorian Hahn  %add = add i64 %b, %a
63106ae108SFlorian Hahn  %cmp = icmp ult i64 %add, %b
64106ae108SFlorian Hahn  %Q = select i1 %cmp, i64 %b, i64 42
65d9e51e75SMatt Arsenault  store i64 %add, ptr %res
66106ae108SFlorian Hahn  ret i64 %Q
67106ae108SFlorian Hahn}
68106ae108SFlorian Hahn
69106ae108SFlorian Hahndefine i64 @uaddo3_overflow_used(i64 %a, i64 %b) nounwind ssp {
70106ae108SFlorian Hahn; CHECK-LABEL: @uaddo3_overflow_used(
71216afd33SFlorian Hahn; CHECK-NEXT:    [[ADD:%.*]] = add i64 [[B:%.*]], [[A:%.*]]
72216afd33SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 [[B]], [[ADD]]
73216afd33SFlorian Hahn; CHECK-NEXT:    [[Q:%.*]] = select i1 [[CMP]], i64 [[B]], i64 42
74106ae108SFlorian Hahn; CHECK-NEXT:    ret i64 [[Q]]
75106ae108SFlorian Hahn;
76106ae108SFlorian Hahn  %add = add i64 %b, %a
77106ae108SFlorian Hahn  %cmp = icmp ugt i64 %b, %add
78106ae108SFlorian Hahn  %Q = select i1 %cmp, i64 %b, i64 42
79106ae108SFlorian Hahn  ret i64 %Q
80106ae108SFlorian Hahn}
81106ae108SFlorian Hahn
82d9e51e75SMatt Arsenaultdefine i64 @uaddo3_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {
83106ae108SFlorian Hahn; CHECK-LABEL: @uaddo3_math_overflow_used(
84106ae108SFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])
85106ae108SFlorian Hahn; CHECK-NEXT:    [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 0
86106ae108SFlorian Hahn; CHECK-NEXT:    [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1
87106ae108SFlorian Hahn; CHECK-NEXT:    [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42
88d9e51e75SMatt Arsenault; CHECK-NEXT:    store i64 [[MATH]], ptr [[RES:%.*]]
89106ae108SFlorian Hahn; CHECK-NEXT:    ret i64 [[Q]]
90106ae108SFlorian Hahn;
91106ae108SFlorian Hahn  %add = add i64 %b, %a
92106ae108SFlorian Hahn  %cmp = icmp ugt i64 %b, %add
93106ae108SFlorian Hahn  %Q = select i1 %cmp, i64 %b, i64 42
94d9e51e75SMatt Arsenault  store i64 %add, ptr %res
95106ae108SFlorian Hahn  ret i64 %Q
96106ae108SFlorian Hahn}
97106ae108SFlorian Hahn
98d9e51e75SMatt Arsenaultdefine i1 @usubo_ult_i64_overflow_used(i64 %x, i64 %y, ptr %p) {
99106ae108SFlorian Hahn; CHECK-LABEL: @usubo_ult_i64_overflow_used(
100106ae108SFlorian Hahn; CHECK-NEXT:    [[S:%.*]] = sub i64 [[X:%.*]], [[Y:%.*]]
101106ae108SFlorian Hahn; CHECK-NEXT:    [[OV:%.*]] = icmp ult i64 [[X]], [[Y]]
102106ae108SFlorian Hahn; CHECK-NEXT:    ret i1 [[OV]]
103106ae108SFlorian Hahn;
104106ae108SFlorian Hahn  %s = sub i64 %x, %y
105106ae108SFlorian Hahn  %ov = icmp ult i64 %x, %y
106106ae108SFlorian Hahn  ret i1 %ov
107106ae108SFlorian Hahn}
108106ae108SFlorian Hahn
109d9e51e75SMatt Arsenaultdefine i1 @usubo_ult_i64_math_overflow_used(i64 %x, i64 %y, ptr %p) {
110106ae108SFlorian Hahn; CHECK-LABEL: @usubo_ult_i64_math_overflow_used(
111106ae108SFlorian Hahn; CHECK-NEXT:    [[S:%.*]] = sub i64 [[X:%.*]], [[Y:%.*]]
112d9e51e75SMatt Arsenault; CHECK-NEXT:    store i64 [[S]], ptr [[P:%.*]]
113106ae108SFlorian Hahn; CHECK-NEXT:    [[OV:%.*]] = icmp ult i64 [[X]], [[Y]]
114106ae108SFlorian Hahn; CHECK-NEXT:    ret i1 [[OV]]
115106ae108SFlorian Hahn;
116106ae108SFlorian Hahn  %s = sub i64 %x, %y
117d9e51e75SMatt Arsenault  store i64 %s, ptr %p
118106ae108SFlorian Hahn  %ov = icmp ult i64 %x, %y
119106ae108SFlorian Hahn  ret i1 %ov
120106ae108SFlorian Hahn}
121106ae108SFlorian Hahn
122*f1ec0d12SNick Anderson; Check that every instruction inserted by -passes='require<profile-summary>,function(codegenprepare)' has a debug location.
123106ae108SFlorian Hahn; DEBUG: CheckModuleDebugify: PASS
124