brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.3 KiB · f2675ce Raw
177 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -S -passes=early-cse -earlycse-debug-hash | FileCheck %s3; RUN: opt < %s -S -passes='early-cse<memssa>' | FileCheck %s4 5; Test use of constrained floating point intrinsics with consistent6; floating point environments. All tests are with strict exception7; behavior and thus _no_ test should trigger CSE.8 9define double @fadd_strict(double %a, double %b) #0 {10; CHECK-LABEL: @fadd_strict(11; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.fadd.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0:[0-9]+]]12; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.experimental.constrained.fadd.f64(double [[A]], double [[B]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]13; CHECK-NEXT:    [[TMP3:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP2]]) #[[ATTR0]]14; CHECK-NEXT:    ret double [[TMP2]]15;16  %1 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.strict") #017  %2 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.strict") #018  %3 = call double @foo.f64(double %1, double %2) #019  ret double %220}21 22define double @fsub_strict(double %a, double %b) #0 {23; CHECK-LABEL: @fsub_strict(24; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.fsub.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]25; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.experimental.constrained.fsub.f64(double [[A]], double [[B]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]26; CHECK-NEXT:    [[TMP3:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP2]]) #[[ATTR0]]27; CHECK-NEXT:    ret double [[TMP2]]28;29  %1 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.strict") #030  %2 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.strict") #031  %3 = call double @foo.f64(double %1, double %2) #032  ret double %233}34 35define double @fmul_strict(double %a, double %b) #0 {36; CHECK-LABEL: @fmul_strict(37; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]38; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[A]], double [[B]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]39; CHECK-NEXT:    [[TMP3:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP2]]) #[[ATTR0]]40; CHECK-NEXT:    ret double [[TMP2]]41;42  %1 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.strict") #043  %2 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.strict") #044  %3 = call double @foo.f64(double %1, double %2) #045  ret double %246}47 48define double @fdiv_strict(double %a, double %b) #0 {49; CHECK-LABEL: @fdiv_strict(50; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]51; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A]], double [[B]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]52; CHECK-NEXT:    [[TMP3:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP2]]) #[[ATTR0]]53; CHECK-NEXT:    ret double [[TMP2]]54;55  %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.strict") #056  %2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.strict") #057  %3 = call double @foo.f64(double %1, double %2) #058  ret double %259}60 61define double @frem_strict(double %a, double %b) #0 {62; CHECK-LABEL: @frem_strict(63; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.frem.f64(double [[A:%.*]], double [[B:%.*]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]64; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.experimental.constrained.frem.f64(double [[A]], double [[B]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]65; CHECK-NEXT:    [[TMP3:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP2]]) #[[ATTR0]]66; CHECK-NEXT:    ret double [[TMP2]]67;68  %1 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.strict") #069  %2 = call double @llvm.experimental.constrained.frem.f64(double %a, double %b, metadata !"round.tonearest", metadata !"fpexcept.strict") #070  %3 = call double @foo.f64(double %1, double %2) #071  ret double %272}73 74define i32 @fptoui_strict(double %a) #0 {75; CHECK-LABEL: @fptoui_strict(76; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double [[A:%.*]], metadata !"fpexcept.strict") #[[ATTR0]]77; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double [[A]], metadata !"fpexcept.strict") #[[ATTR0]]78; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]79; CHECK-NEXT:    ret i32 [[TMP2]]80;81  %1 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.strict") #082  %2 = call i32 @llvm.experimental.constrained.fptoui.i32.f64(double %a, metadata !"fpexcept.strict") #083  %3 = call i32 @bar.i32(i32 %1, i32 %1) #084  ret i32 %285}86 87define double @uitofp_strict(i32 %a) #0 {88; CHECK-LABEL: @uitofp_strict(89; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]90; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 [[A]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]91; CHECK-NEXT:    [[TMP3:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]92; CHECK-NEXT:    ret double [[TMP2]]93;94  %1 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.strict") #095  %2 = call double @llvm.experimental.constrained.uitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.strict") #096  %3 = call double @foo.f64(double %1, double %1) #097  ret double %298}99 100define i32 @fptosi_strict(double %a) #0 {101; CHECK-LABEL: @fptosi_strict(102; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double [[A:%.*]], metadata !"fpexcept.strict") #[[ATTR0]]103; CHECK-NEXT:    [[TMP2:%.*]] = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double [[A]], metadata !"fpexcept.strict") #[[ATTR0]]104; CHECK-NEXT:    [[TMP3:%.*]] = call i32 @bar.i32(i32 [[TMP1]], i32 [[TMP1]]) #[[ATTR0]]105; CHECK-NEXT:    ret i32 [[TMP2]]106;107  %1 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.strict") #0108  %2 = call i32 @llvm.experimental.constrained.fptosi.i32.f64(double %a, metadata !"fpexcept.strict") #0109  %3 = call i32 @bar.i32(i32 %1, i32 %1) #0110  ret i32 %2111}112 113define double @sitofp_strict(i32 %a) #0 {114; CHECK-LABEL: @sitofp_strict(115; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 [[A:%.*]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]116; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 [[A]], metadata !"round.tonearest", metadata !"fpexcept.strict") #[[ATTR0]]117; CHECK-NEXT:    [[TMP3:%.*]] = call double @foo.f64(double [[TMP1]], double [[TMP1]]) #[[ATTR0]]118; CHECK-NEXT:    ret double [[TMP2]]119;120  %1 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.strict") #0121  %2 = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 %a, metadata !"round.tonearest", metadata !"fpexcept.strict") #0122  %3 = call double @foo.f64(double %1, double %1) #0123  ret double %2124}125 126define i1 @fcmp_strict(double %a, double %b) #0 {127; CHECK-LABEL: @fcmp_strict(128; CHECK-NEXT:    [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.strict") #[[ATTR0]]129; CHECK-NEXT:    [[TMP2:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[A]], double [[B]], metadata !"oeq", metadata !"fpexcept.strict") #[[ATTR0]]130; CHECK-NEXT:    [[TMP3:%.*]] = zext i1 [[TMP1]] to i32131; CHECK-NEXT:    [[TMP4:%.*]] = zext i1 [[TMP2]] to i32132; CHECK-NEXT:    [[TMP5:%.*]] = call i32 @bar.i32(i32 [[TMP3]], i32 [[TMP4]]) #[[ATTR0]]133; CHECK-NEXT:    ret i1 [[TMP2]]134;135  %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.strict") #0136  %2 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.strict") #0137  %3 = zext i1 %1 to i32138  %4 = zext i1 %2 to i32139  %5 = call i32 @bar.i32(i32 %3, i32 %4) #0140  ret i1 %2141}142 143define i1 @fcmps_strict(double %a, double %b) #0 {144; CHECK-LABEL: @fcmps_strict(145; CHECK-NEXT:    [[TMP1:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double [[A:%.*]], double [[B:%.*]], metadata !"oeq", metadata !"fpexcept.strict") #[[ATTR0]]146; CHECK-NEXT:    [[TMP2:%.*]] = call i1 @llvm.experimental.constrained.fcmps.f64(double [[A]], double [[B]], metadata !"oeq", metadata !"fpexcept.strict") #[[ATTR0]]147; CHECK-NEXT:    [[TMP3:%.*]] = zext i1 [[TMP1]] to i32148; CHECK-NEXT:    [[TMP4:%.*]] = zext i1 [[TMP2]] to i32149; CHECK-NEXT:    [[TMP5:%.*]] = call i32 @bar.i32(i32 [[TMP3]], i32 [[TMP4]]) #[[ATTR0]]150; CHECK-NEXT:    ret i1 [[TMP2]]151;152  %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.strict") #0153  %2 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.strict") #0154  %3 = zext i1 %1 to i32155  %4 = zext i1 %2 to i32156  %5 = call i32 @bar.i32(i32 %3, i32 %4) #0157  ret i1 %2158}159 160attributes #0 = { strictfp }161 162declare void @arbitraryfunc() #0163declare double @foo.f64(double, double) #0164declare i32 @bar.i32(i32, i32) #0165 166declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)167declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata)168declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)169declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)170declare double @llvm.experimental.constrained.frem.f64(double, double, metadata, metadata)171declare i32 @llvm.experimental.constrained.fptoui.i32.f64(double, metadata)172declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata)173declare i32 @llvm.experimental.constrained.fptosi.i32.f64(double, metadata)174declare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata)175declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata)176declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata)177