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