124 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -S < %s | FileCheck %s3; RUN: opt -enable-debugify -passes='require<profile-summary>,function(codegenprepare)' -S < %s 2>&1 | FileCheck %s -check-prefix=DEBUG4 5; Subset of tests from llvm/tests/Transforms/CodeGenPrepare/X86/overflow-intrinsics.ll6; to test shouldFormOverflowOp on SPARC, where it is not profitable to create7; overflow intrinsics if the math part is not used.8 9target triple = "sparc64-unknown-linux"10 11define i64 @uaddo1_overflow_used(i64 %a, i64 %b) nounwind ssp {12; CHECK-LABEL: @uaddo1_overflow_used(13; CHECK-NEXT: [[ADD:%.*]] = add i64 [[B:%.*]], [[A:%.*]]14; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[ADD]], [[A]]15; CHECK-NEXT: [[Q:%.*]] = select i1 [[CMP]], i64 [[B]], i64 4216; CHECK-NEXT: ret i64 [[Q]]17;18 %add = add i64 %b, %a19 %cmp = icmp ult i64 %add, %a20 %Q = select i1 %cmp, i64 %b, i64 4221 ret i64 %Q22}23 24define i64 @uaddo1_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {25; CHECK-LABEL: @uaddo1_math_overflow_used(26; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])27; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 028; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 129; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 4230; CHECK-NEXT: store i64 [[MATH]], ptr [[RES:%.*]]31; CHECK-NEXT: ret i64 [[Q]]32;33 %add = add i64 %b, %a34 %cmp = icmp ult i64 %add, %a35 %Q = select i1 %cmp, i64 %b, i64 4236 store i64 %add, ptr %res37 ret i64 %Q38}39 40define i64 @uaddo2_overflow_used(i64 %a, i64 %b) nounwind ssp {41; CHECK-LABEL: @uaddo2_overflow_used(42; CHECK-NEXT: [[ADD:%.*]] = add i64 [[B:%.*]], [[A:%.*]]43; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[ADD]], [[B]]44; CHECK-NEXT: [[Q:%.*]] = select i1 [[CMP]], i64 [[B]], i64 4245; CHECK-NEXT: ret i64 [[Q]]46;47 %add = add i64 %b, %a48 %cmp = icmp ult i64 %add, %b49 %Q = select i1 %cmp, i64 %b, i64 4250 ret i64 %Q51}52 53define i64 @uaddo2_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {54; CHECK-LABEL: @uaddo2_math_overflow_used(55; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])56; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 057; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 158; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 4259; CHECK-NEXT: store i64 [[MATH]], ptr [[RES:%.*]]60; CHECK-NEXT: ret i64 [[Q]]61;62 %add = add i64 %b, %a63 %cmp = icmp ult i64 %add, %b64 %Q = select i1 %cmp, i64 %b, i64 4265 store i64 %add, ptr %res66 ret i64 %Q67}68 69define i64 @uaddo3_overflow_used(i64 %a, i64 %b) nounwind ssp {70; CHECK-LABEL: @uaddo3_overflow_used(71; CHECK-NEXT: [[ADD:%.*]] = add i64 [[B:%.*]], [[A:%.*]]72; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[B]], [[ADD]]73; CHECK-NEXT: [[Q:%.*]] = select i1 [[CMP]], i64 [[B]], i64 4274; CHECK-NEXT: ret i64 [[Q]]75;76 %add = add i64 %b, %a77 %cmp = icmp ugt i64 %b, %add78 %Q = select i1 %cmp, i64 %b, i64 4279 ret i64 %Q80}81 82define i64 @uaddo3_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {83; CHECK-LABEL: @uaddo3_math_overflow_used(84; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])85; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 086; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 187; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 4288; CHECK-NEXT: store i64 [[MATH]], ptr [[RES:%.*]]89; CHECK-NEXT: ret i64 [[Q]]90;91 %add = add i64 %b, %a92 %cmp = icmp ugt i64 %b, %add93 %Q = select i1 %cmp, i64 %b, i64 4294 store i64 %add, ptr %res95 ret i64 %Q96}97 98define i1 @usubo_ult_i64_overflow_used(i64 %x, i64 %y, ptr %p) {99; CHECK-LABEL: @usubo_ult_i64_overflow_used(100; CHECK-NEXT: [[S:%.*]] = sub i64 [[X:%.*]], [[Y:%.*]]101; CHECK-NEXT: [[OV:%.*]] = icmp ult i64 [[X]], [[Y]]102; CHECK-NEXT: ret i1 [[OV]]103;104 %s = sub i64 %x, %y105 %ov = icmp ult i64 %x, %y106 ret i1 %ov107}108 109define i1 @usubo_ult_i64_math_overflow_used(i64 %x, i64 %y, ptr %p) {110; CHECK-LABEL: @usubo_ult_i64_math_overflow_used(111; CHECK-NEXT: [[S:%.*]] = sub i64 [[X:%.*]], [[Y:%.*]]112; CHECK-NEXT: store i64 [[S]], ptr [[P:%.*]]113; CHECK-NEXT: [[OV:%.*]] = icmp ult i64 [[X]], [[Y]]114; CHECK-NEXT: ret i1 [[OV]]115;116 %s = sub i64 %x, %y117 store i64 %s, ptr %p118 %ov = icmp ult i64 %x, %y119 ret i1 %ov120}121 122; Check that every instruction inserted by -passes='require<profile-summary>,function(codegenprepare)' has a debug location.123; DEBUG: CheckModuleDebugify: PASS124