brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.4 KiB · f72679f Raw
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