381 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --check-globals --version 22; RUN: opt -S -passes=attributor < %s | FileCheck %s3 4; Keep the attribute checks clean by disabling inference of anything else.5declare void @call_of_mystery()6 7; Should infer to ieee,ieee/default8define internal void @leaf_dynamic_dynamic_from_ieee_ieee() #0 {9; CHECK-LABEL: define internal void @leaf_dynamic_dynamic_from_ieee_ieee() {10; CHECK-NEXT: call void @call_of_mystery()11; CHECK-NEXT: ret void12;13 call void @call_of_mystery()14 ret void15}16 17; Should infer to ieee,ieee/default18define internal void @leaf_recursive_dynamic_dynamic_from_ieee_ieee() #0 {19; CHECK-LABEL: define internal void @leaf_recursive_dynamic_dynamic_from_ieee_ieee() {20; CHECK-NEXT: call void @call_of_mystery()21; CHECK-NEXT: call void @leaf_recursive_dynamic_dynamic_from_ieee_ieee()22; CHECK-NEXT: ret void23;24 call void @call_of_mystery()25 call void @leaf_recursive_dynamic_dynamic_from_ieee_ieee()26 ret void27}28 29; Should strip denormal-fp-math for default ieee30define internal void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_ieee_ieee() #1 {31; CHECK-LABEL: define internal void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_ieee_ieee() {32; CHECK-NEXT: call void @call_of_mystery()33; CHECK-NEXT: ret void34;35 call void @call_of_mystery()36 ret void37}38 39; Should infer to preserve-sign,preserve-sign40define internal void @leaf_dynamic_dynamic_from_daz_daz() #0 {41; CHECK-LABEL: define internal void @leaf_dynamic_dynamic_from_daz_daz42; CHECK-SAME: () #[[ATTR0:[0-9]+]] {43; CHECK-NEXT: call void @call_of_mystery()44; CHECK-NEXT: ret void45;46 call void @call_of_mystery()47 ret void48}49 50; This goes to invalid because of the mismatch in the main mode. We51; could theoretically refine to denormal-fp-math-f32=preserve-sign,preserve-sign52define internal void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz() #1 {53; CHECK-LABEL: define internal void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz54; CHECK-SAME: () #[[ATTR1:[0-9]+]] {55; CHECK-NEXT: call void @call_of_mystery()56; CHECK-NEXT: ret void57;58 call void @call_of_mystery()59 ret void60}61 62; Leave this alone, must stay dynamic,dynamic63define internal void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee() #0 {64; CHECK-LABEL: define internal void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee65; CHECK-SAME: () #[[ATTR2:[0-9]+]] {66; CHECK-NEXT: call void @call_of_mystery()67; CHECK-NEXT: ret void68;69 call void @call_of_mystery()70 ret void71}72 73; Leave this alone, should only have denormal-fp-math-f32=ieee,ieee74define internal void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee() #1 {75; CHECK-LABEL: define internal void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee76; CHECK-SAME: () #[[ATTR1]] {77; CHECK-NEXT: call void @call_of_mystery()78; CHECK-NEXT: ret void79;80 call void @call_of_mystery()81 ret void82}83 84; Leave as dynamic,dynamic85define void @externally_visible_dynamic_dynamic_from_ieee_ieee() #0 {86; CHECK-LABEL: define void @externally_visible_dynamic_dynamic_from_ieee_ieee87; CHECK-SAME: () #[[ATTR2]] {88; CHECK-NEXT: call void @call_of_mystery()89; CHECK-NEXT: ret void90;91 call void @call_of_mystery()92 ret void93}94 95; Should infer to positive-zero,positive-zero96define internal void @leaf_dynamic_dynamic_from_dapz_dapz() #0 {97; CHECK-LABEL: define internal void @leaf_dynamic_dynamic_from_dapz_dapz98; CHECK-SAME: () #[[ATTR3:[0-9]+]] {99; CHECK-NEXT: call void @call_of_mystery()100; CHECK-NEXT: ret void101;102 call void @call_of_mystery()103 ret void104}105 106; ieee,ieee entry point107define void @func_ieee_ieee() #2 {108; CHECK-LABEL: define void @func_ieee_ieee() {109; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_ieee_ieee()110; CHECK-NEXT: call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_ieee_ieee()111; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee()112; CHECK-NEXT: call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee()113; CHECK-NEXT: call void @externally_visible_dynamic_dynamic_from_ieee_ieee()114; CHECK-NEXT: call void @leaf_dynamic_ieee_from_ieee_ieee()115; CHECK-NEXT: call void @leaf_ieee_dynamic_from_ieee_ieee()116; CHECK-NEXT: call void @leaf_recursive_dynamic_dynamic_from_ieee_ieee()117; CHECK-NEXT: ret void118;119 call void @leaf_dynamic_dynamic_from_ieee_ieee()120 call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_ieee_ieee()121 call void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee()122 call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee()123 call void @externally_visible_dynamic_dynamic_from_ieee_ieee()124 call void @leaf_dynamic_ieee_from_ieee_ieee()125 call void @leaf_ieee_dynamic_from_ieee_ieee()126 call void @leaf_recursive_dynamic_dynamic_from_ieee_ieee()127 ret void128}129 130; ieee,ieee entry point131define void @func_default_is_ieee_ieee() {132; CHECK-LABEL: define void @func_default_is_ieee_ieee() {133; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_ieee_ieee()134; CHECK-NEXT: call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_ieee_ieee()135; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee()136; CHECK-NEXT: call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee()137; CHECK-NEXT: call void @externally_visible_dynamic_dynamic_from_ieee_ieee()138; CHECK-NEXT: call void @leaf_dynamic_ieee_from_ieee_ieee()139; CHECK-NEXT: call void @leaf_ieee_dynamic_from_ieee_ieee()140; CHECK-NEXT: call void @leaf_recursive_dynamic_dynamic_from_ieee_ieee()141; CHECK-NEXT: ret void142;143 call void @leaf_dynamic_dynamic_from_ieee_ieee()144 call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_ieee_ieee()145 call void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee()146 call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee()147 call void @externally_visible_dynamic_dynamic_from_ieee_ieee()148 call void @leaf_dynamic_ieee_from_ieee_ieee()149 call void @leaf_ieee_dynamic_from_ieee_ieee()150 call void @leaf_recursive_dynamic_dynamic_from_ieee_ieee()151 ret void152}153 154; preserve-sign,preserve-sign entry point155define void @func_daz_daz() #3 {156; CHECK-LABEL: define void @func_daz_daz157; CHECK-SAME: () #[[ATTR0]] {158; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_daz_daz()159; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee()160; CHECK-NEXT: call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee()161; CHECK-NEXT: call void @leaf_f64_dynamic_f64_dynamic__f32_daz_f32_daz_from__daz_daz()162; CHECK-NEXT: call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz()163; CHECK-NEXT: ret void164;165 call void @leaf_dynamic_dynamic_from_daz_daz()166 call void @leaf_dynamic_dynamic_from_daz_daz_and_ieee_ieee()167 call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz_and_ieee_ieee()168 call void @leaf_f64_dynamic_f64_dynamic__f32_daz_f32_daz_from__daz_daz()169 call void @leaf_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic__dynamic_dynamic_from_daz_daz()170 ret void171}172 173; positive-zero,positive-zero entry point174define void @func_dapz_dapz() #4 {175; CHECK-LABEL: define void @func_dapz_dapz176; CHECK-SAME: () #[[ATTR3]] {177; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_dapz_dapz()178; CHECK-NEXT: ret void179;180 call void @leaf_dynamic_dynamic_from_dapz_dapz()181 ret void182}183 184; Could be fully preserve-sign,preserve-sign, but this isn't a185; realistic case and we don't bother trying to handle it.186define internal void @leaf_f64_dynamic_f64_dynamic__f32_daz_f32_daz_from__daz_daz() #5 {187; CHECK-LABEL: define internal void @leaf_f64_dynamic_f64_dynamic__f32_daz_f32_daz_from__daz_daz188; CHECK-SAME: () #[[ATTR4:[0-9]+]] {189; CHECK-NEXT: call void @call_of_mystery()190; CHECK-NEXT: ret void191;192 call void @call_of_mystery()193 ret void194}195 196; -> ieee,ieee197define internal void @leaf_dynamic_ieee_from_ieee_ieee() #6 {198; CHECK-LABEL: define internal void @leaf_dynamic_ieee_from_ieee_ieee() {199; CHECK-NEXT: call void @call_of_mystery()200; CHECK-NEXT: ret void201;202 call void @call_of_mystery()203 ret void204}205 206; -> ieee,ieee207define internal void @leaf_ieee_dynamic_from_ieee_ieee() #7 {208; CHECK-LABEL: define internal void @leaf_ieee_dynamic_from_ieee_ieee() {209; CHECK-NEXT: call void @call_of_mystery()210; CHECK-NEXT: ret void211;212 call void @call_of_mystery()213 ret void214}215 216; Specialize the f64 mode to ieee,ieee but leave f32 as dynamic,dynamic217define internal void @leaf_dynamic_dynamic_from_f64_ieee_f32_dynamic() #0 {218; CHECK-LABEL: define internal void @leaf_dynamic_dynamic_from_f64_ieee_f32_dynamic219; CHECK-SAME: () #[[ATTR1]] {220; CHECK-NEXT: call void @call_of_mystery()221; CHECK-NEXT: ret void222;223 call void @call_of_mystery()224 ret void225}226 227define void @func_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic() #1 {228; CHECK-LABEL: define void @func_f64_ieee_f64_ieee__f32_dynamic_f32_dynamic229; CHECK-SAME: () #[[ATTR1]] {230; CHECK-NEXT: call void @leaf_dynamic_dynamic_from_f64_ieee_f32_dynamic()231; CHECK-NEXT: ret void232;233 call void @leaf_dynamic_dynamic_from_f64_ieee_f32_dynamic()234 ret void235}236 237; -> preserve-sign,ieee.238define internal void @leaf_daz_dynamic_from_dynamic_ieee() #8 {239; CHECK-LABEL: define internal void @leaf_daz_dynamic_from_dynamic_ieee240; CHECK-SAME: () #[[ATTR5:[0-9]+]] {241; CHECK-NEXT: call void @call_of_mystery()242; CHECK-NEXT: ret void243;244 call void @call_of_mystery()245 ret void246}247 248define void @dynamic_ieee() #6 {249; CHECK-LABEL: define void @dynamic_ieee250; CHECK-SAME: () #[[ATTR6:[0-9]+]] {251; CHECK-NEXT: call void @leaf_daz_dynamic_from_dynamic_ieee()252; CHECK-NEXT: ret void253;254 call void @leaf_daz_dynamic_from_dynamic_ieee()255 ret void256}257 258; Leave unchanged as ieee,ieeee259define internal void @leaf_ieee_ieee_from_dynamic() {260; CHECK-LABEL: define internal void @leaf_ieee_ieee_from_dynamic() {261; CHECK-NEXT: call void @call_of_mystery()262; CHECK-NEXT: ret void263;264 call void @call_of_mystery()265 ret void266}267 268; Leave unchanged as dynamic,dynamic269define internal void @leaf_dynamic_from_dynamic() {270; CHECK-LABEL: define internal void @leaf_dynamic_from_dynamic() {271; CHECK-NEXT: call void @call_of_mystery()272; CHECK-NEXT: ret void273;274 call void @call_of_mystery()275 ret void276}277 278; Leave unchanged as preserve-sign,preserve-sign279define internal void @leaf_daz_daz_from_dynamic() #3 {280; CHECK-LABEL: define internal void @leaf_daz_daz_from_dynamic281; CHECK-SAME: () #[[ATTR0]] {282; CHECK-NEXT: call void @call_of_mystery()283; CHECK-NEXT: ret void284;285 call void @call_of_mystery()286 ret void287}288 289define void @dynamic_dynamic() #0 {290; CHECK-LABEL: define void @dynamic_dynamic291; CHECK-SAME: () #[[ATTR2]] {292; CHECK-NEXT: call void @leaf_ieee_ieee_from_dynamic()293; CHECK-NEXT: call void @leaf_daz_daz_from_dynamic()294; CHECK-NEXT: call void @leaf_dynamic_from_dynamic()295; CHECK-NEXT: ret void296;297 call void @leaf_ieee_ieee_from_dynamic()298 call void @leaf_daz_daz_from_dynamic()299 call void @leaf_dynamic_from_dynamic()300 ret void301}302 303define internal void @leaf_ieee_f64_daz_f32() #9 {304; CHECK-LABEL: define internal void @leaf_ieee_f64_daz_f32305; CHECK-SAME: () #[[ATTR7:[0-9]+]] {306; CHECK-NEXT: call void @call_of_mystery()307; CHECK-NEXT: ret void308;309 call void @call_of_mystery()310 ret void311}312 313define internal void @leaf_ieee_f64_daz_f32_from_ieee_f64_dynamic_f32() #10 {314; CHECK-LABEL: define internal void @leaf_ieee_f64_daz_f32_from_ieee_f64_dynamic_f32315; CHECK-SAME: () #[[ATTR8:[0-9]+]] {316; CHECK-NEXT: call void @call_of_mystery()317; CHECK-NEXT: ret void318;319 call void @call_of_mystery()320 ret void321}322 323define void @ieee_f64_dynamic_f32() #1 {324; CHECK-LABEL: define void @ieee_f64_dynamic_f32325; CHECK-SAME: () #[[ATTR1]] {326; CHECK-NEXT: call void @leaf_ieee_f64_daz_f32()327; CHECK-NEXT: call void @leaf_ieee_f64_daz_f32_from_ieee_f64_dynamic_f32()328; CHECK-NEXT: ret void329;330 call void @leaf_ieee_f64_daz_f32()331 call void @leaf_ieee_f64_daz_f32_from_ieee_f64_dynamic_f32()332 ret void333}334 335; => "preserve-sign,positive-zero" + "denormal-fp-math-f32"="ieee,positive-zero"336define internal void @leaf_daz_dynamic_dynamic_dapz_from_daz_dapz_ieee_dapz() #11 {337; CHECK-LABEL: define internal void @leaf_daz_dynamic_dynamic_dapz_from_daz_dapz_ieee_dapz338; CHECK-SAME: () #[[ATTR9:[0-9]+]] {339; CHECK-NEXT: call void @call_of_mystery()340; CHECK-NEXT: ret void341;342 call void @call_of_mystery()343 ret void344}345 346define void @daz_dapz_ieee_dapz() #12 {347; CHECK-LABEL: define void @daz_dapz_ieee_dapz348; CHECK-SAME: () #[[ATTR9]] {349; CHECK-NEXT: call void @leaf_daz_dynamic_dynamic_dapz_from_daz_dapz_ieee_dapz()350; CHECK-NEXT: ret void351;352 call void @leaf_daz_dynamic_dynamic_dapz_from_daz_dapz_ieee_dapz()353 ret void354}355 356attributes #0 = { "denormal-fp-math"="dynamic,dynamic" }357attributes #1 = { "denormal-fp-math-f32"="dynamic,dynamic" }358attributes #2 = { "denormal-fp-math"="ieee,ieee" }359attributes #3 = { "denormal-fp-math"="preserve-sign,preserve-sign" }360attributes #4 = { "denormal-fp-math"="positive-zero,positive-zero" }361attributes #5 = { "denormal-fp-math"="dynamic,dynamic" "denormal-fp-math-f32"="preserve-sign,preserve-sign" }362attributes #6 = { "denormal-fp-math"="dynamic,ieee" }363attributes #7 = { "denormal-fp-math"="ieee,dynamic" }364attributes #8 = { "denormal-fp-math"="preserve-sign,dynamic" }365attributes #9 = { "denormal-fp-math-f32"="preserve-sign,preserve-sign" }366attributes #10 = { "denormal-fp-math"="preserve-sign,preserve-sign" "denormal-fp-math-f32"="ieee,ieee" }367attributes #11 = { "denormal-fp-math"="preserve-sign,dynamic" "denormal-fp-math-f32"="dynamic,positive-zero" }368attributes #12 = { "denormal-fp-math"="preserve-sign,positive-zero" "denormal-fp-math-f32"="ieee,positive-zero" }369;.370; CHECK: attributes #[[ATTR0]] = { "denormal-fp-math"="preserve-sign,preserve-sign" }371; CHECK: attributes #[[ATTR1]] = { "denormal-fp-math-f32"="dynamic,dynamic" }372; CHECK: attributes #[[ATTR2]] = { "denormal-fp-math"="dynamic,dynamic" }373; CHECK: attributes #[[ATTR3]] = { "denormal-fp-math"="positive-zero,positive-zero" }374; CHECK: attributes #[[ATTR4]] = { "denormal-fp-math"="dynamic,dynamic" "denormal-fp-math-f32"="preserve-sign,preserve-sign" }375; CHECK: attributes #[[ATTR5]] = { "denormal-fp-math"="preserve-sign,ieee" }376; CHECK: attributes #[[ATTR6]] = { "denormal-fp-math"="dynamic,ieee" }377; CHECK: attributes #[[ATTR7]] = { "denormal-fp-math-f32"="preserve-sign,preserve-sign" }378; CHECK: attributes #[[ATTR8]] = { "denormal-fp-math"="preserve-sign,preserve-sign" "denormal-fp-math-f32"="ieee,ieee" }379; CHECK: attributes #[[ATTR9]] = { "denormal-fp-math"="preserve-sign,positive-zero" "denormal-fp-math-f32"="ieee,positive-zero" }380;.381