172 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 = "arm64-apple-iphoneos"10 11define i64 @uaddo1_overflow_used(i64 %a, i64 %b) nounwind ssp {12; CHECK-LABEL: @uaddo1_overflow_used(13; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])14; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 015; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 116; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 4217; CHECK-NEXT: ret i64 [[Q]]18;19 %add = add i64 %b, %a20 %cmp = icmp ult i64 %add, %a21 %Q = select i1 %cmp, i64 %b, i64 4222 ret i64 %Q23}24 25define i64 @uaddo1_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {26; CHECK-LABEL: @uaddo1_math_overflow_used(27; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])28; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 029; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 130; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 4231; CHECK-NEXT: store i64 [[MATH]], ptr [[RES:%.*]]32; CHECK-NEXT: ret i64 [[Q]]33;34 %add = add i64 %b, %a35 %cmp = icmp ult i64 %add, %a36 %Q = select i1 %cmp, i64 %b, i64 4237 store i64 %add, ptr %res38 ret i64 %Q39}40 41define i64 @uaddo2_overflow_used(i64 %a, i64 %b) nounwind ssp {42; CHECK-LABEL: @uaddo2_overflow_used(43; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])44; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 045; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 146; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 4247; CHECK-NEXT: ret i64 [[Q]]48;49 %add = add i64 %b, %a50 %cmp = icmp ult i64 %add, %b51 %Q = select i1 %cmp, i64 %b, i64 4252 ret i64 %Q53}54 55define i64 @uaddo2_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {56; CHECK-LABEL: @uaddo2_math_overflow_used(57; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])58; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 059; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 160; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 4261; CHECK-NEXT: store i64 [[MATH]], ptr [[RES:%.*]]62; CHECK-NEXT: ret i64 [[Q]]63;64 %add = add i64 %b, %a65 %cmp = icmp ult i64 %add, %b66 %Q = select i1 %cmp, i64 %b, i64 4267 store i64 %add, ptr %res68 ret i64 %Q69}70 71define i64 @uaddo3_overflow_used(i64 %a, i64 %b) nounwind ssp {72; CHECK-LABEL: @uaddo3_overflow_used(73; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])74; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 075; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 176; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 4277; CHECK-NEXT: ret i64 [[Q]]78;79 %add = add i64 %b, %a80 %cmp = icmp ugt i64 %b, %add81 %Q = select i1 %cmp, i64 %b, i64 4282 ret i64 %Q83}84 85define i64 @uaddo3_math_overflow_used(i64 %a, i64 %b, ptr %res) nounwind ssp {86; CHECK-LABEL: @uaddo3_math_overflow_used(87; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[B:%.*]], i64 [[A:%.*]])88; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i64, i1 } [[TMP1]], 089; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 190; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 4291; CHECK-NEXT: store i64 [[MATH]], ptr [[RES:%.*]]92; CHECK-NEXT: ret i64 [[Q]]93;94 %add = add i64 %b, %a95 %cmp = icmp ugt i64 %b, %add96 %Q = select i1 %cmp, i64 %b, i64 4297 store i64 %add, ptr %res98 ret i64 %Q99}100 101; Instcombine folds (a + b <u a) to (a ^ -1 <u b). Make sure we match this102; pattern as well.103define i64 @uaddo6_xor(i64 %a, i64 %b) {104; CHECK-LABEL: @uaddo6_xor(105; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[A:%.*]], i64 [[B:%.*]])106; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1107; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42108; CHECK-NEXT: ret i64 [[Q]]109;110 %x = xor i64 %a, -1111 %cmp = icmp ult i64 %x, %b112 %Q = select i1 %cmp, i64 %b, i64 42113 ret i64 %Q114}115 116define i64 @uaddo6_xor_commuted(i64 %a, i64 %b) {117; CHECK-LABEL: @uaddo6_xor_commuted(118; CHECK-NEXT: [[TMP1:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[A:%.*]], i64 [[B:%.*]])119; CHECK-NEXT: [[OV:%.*]] = extractvalue { i64, i1 } [[TMP1]], 1120; CHECK-NEXT: [[Q:%.*]] = select i1 [[OV]], i64 [[B]], i64 42121; CHECK-NEXT: ret i64 [[Q]]122;123 %x = xor i64 %a, -1124 %cmp = icmp ugt i64 %b, %x125 %Q = select i1 %cmp, i64 %b, i64 42126 ret i64 %Q127}128 129declare void @use(i64)130 131define i64 @uaddo6_xor_multi_use(i64 %a, i64 %b) {132; CHECK-LABEL: @uaddo6_xor_multi_use(133; CHECK-NEXT: [[X:%.*]] = xor i64 -1, [[A:%.*]]134; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[X]], [[B:%.*]]135; CHECK-NEXT: [[Q:%.*]] = select i1 [[CMP]], i64 [[B]], i64 42136; CHECK-NEXT: call void @use(i64 [[X]])137; CHECK-NEXT: ret i64 [[Q]]138;139 %x = xor i64 -1, %a140 %cmp = icmp ult i64 %x, %b141 %Q = select i1 %cmp, i64 %b, i64 42142 call void @use(i64 %x)143 ret i64 %Q144}145 146define i1 @usubo_ult_i64_overflow_used(i64 %x, i64 %y, ptr %p) {147; CHECK-LABEL: @usubo_ult_i64_overflow_used(148; CHECK-NEXT: [[S:%.*]] = sub i64 [[X:%.*]], [[Y:%.*]]149; CHECK-NEXT: [[OV:%.*]] = icmp ult i64 [[X]], [[Y]]150; CHECK-NEXT: ret i1 [[OV]]151;152 %s = sub i64 %x, %y153 %ov = icmp ult i64 %x, %y154 ret i1 %ov155}156 157define i1 @usubo_ult_i64_math_overflow_used(i64 %x, i64 %y, ptr %p) {158; CHECK-LABEL: @usubo_ult_i64_math_overflow_used(159; CHECK-NEXT: [[S:%.*]] = sub i64 [[X:%.*]], [[Y:%.*]]160; CHECK-NEXT: store i64 [[S]], ptr [[P:%.*]]161; CHECK-NEXT: [[OV:%.*]] = icmp ult i64 [[X]], [[Y]]162; CHECK-NEXT: ret i1 [[OV]]163;164 %s = sub i64 %x, %y165 store i64 %s, ptr %p166 %ov = icmp ult i64 %x, %y167 ret i1 %ov168}169 170; Check that every instruction inserted by -passes='require<profile-summary>,function(codegenprepare)' has a debug location.171; DEBUG: CheckModuleDebugify: PASS172