| ; RUN: llvm-as < %s | llvm-dis | FileCheck %s | |
| ; Invalid but didn't fail the verifier | |
| define void @str_denormal_fp_math_no_val() "denormal-fp-math" { | |
| ; CHECK: Function Attrs: denormal_fpenv(ieee) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_no_val( | |
| ; CHECK-SAME: ) #[[ATTR0:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| ; Invalid but didn't fail the verifier | |
| define void @str_denormal_fp_math_empty_str() "denormal-fp-math"="" { | |
| ; CHECK: Function Attrs: denormal_fpenv(ieee) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_empty_str( | |
| ; CHECK-SAME: ) #[[ATTR0]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_ieee() "denormal-fp-math"="ieee" { | |
| ; CHECK: Function Attrs: denormal_fpenv(ieee) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_ieee( | |
| ; CHECK-SAME: ) #[[ATTR0]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_ieee_ieee() "denormal-fp-math"="ieee,ieee" { | |
| ; CHECK: Function Attrs: denormal_fpenv(ieee) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_ieee_ieee( | |
| ; CHECK-SAME: ) #[[ATTR0]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_preserve_sign() "denormal-fp-math"="preserve-sign" { | |
| ; CHECK: Function Attrs: denormal_fpenv(preservesign) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_preserve_sign( | |
| ; CHECK-SAME: ) #[[ATTR1:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_preserve_sign_preserve_sign() "denormal-fp-math"="preserve-sign,preserve-sign" { | |
| ; CHECK: Function Attrs: denormal_fpenv(preservesign) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_preserve_sign_preserve_sign( | |
| ; CHECK-SAME: ) #[[ATTR1]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_dynamic() "denormal-fp-math"="dynamic" { | |
| ; CHECK: Function Attrs: denormal_fpenv(dynamic) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_dynamic( | |
| ; CHECK-SAME: ) #[[ATTR2:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_dynamic_dynamic() "denormal-fp-math"="dynamic,dynamic" { | |
| ; CHECK: Function Attrs: denormal_fpenv(dynamic) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_dynamic_dynamic( | |
| ; CHECK-SAME: ) #[[ATTR2]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_positivezero() "denormal-fp-math"="positive-zero" { | |
| ; CHECK: Function Attrs: denormal_fpenv(positivezero) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_positivezero( | |
| ; CHECK-SAME: ) #[[ATTR3:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_positivezero_positivezero() "denormal-fp-math"="positive-zero,positive-zero" { | |
| ; CHECK: Function Attrs: denormal_fpenv(positivezero) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_positivezero_positivezero( | |
| ; CHECK-SAME: ) #[[ATTR3]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_ieee_preservesign() "denormal-fp-math"="ieee,preserve-sign" { | |
| ; CHECK: Function Attrs: denormal_fpenv(ieee|preservesign) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_ieee_preservesign( | |
| ; CHECK-SAME: ) #[[ATTR4:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_preservesign_ieee() "denormal-fp-math"="preserve-sign,ieee" { | |
| ; CHECK: Function Attrs: denormal_fpenv(preservesign|ieee) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_preservesign_ieee( | |
| ; CHECK-SAME: ) #[[ATTR5:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| ; Invalid but didn't fail the verifier | |
| define void @str_denormal_fp_math_f32_no_val() "denormal-fp-math-f32" { | |
| ; CHECK: Function Attrs: denormal_fpenv(ieee) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_f32_no_val( | |
| ; CHECK-SAME: ) #[[ATTR0]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| ; Invalid but didn't fail the verifier | |
| define void @str_denormal_fp_math_f32_empty_str() "denormal-fp-math-f32"="" { | |
| ; CHECK: Function Attrs: denormal_fpenv(ieee) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_f32_empty_str( | |
| ; CHECK-SAME: ) #[[ATTR0]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_f32_ieee() "denormal-fp-math-f32"="ieee" { | |
| ; CHECK: Function Attrs: denormal_fpenv(ieee) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_f32_ieee( | |
| ; CHECK-SAME: ) #[[ATTR0]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_f32_ieee_ieee() "denormal-fp-math-f32"="ieee,ieee" { | |
| ; CHECK: Function Attrs: denormal_fpenv(ieee) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_f32_ieee_ieee( | |
| ; CHECK-SAME: ) #[[ATTR0]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_f32_preserve_sign() "denormal-fp-math-f32"="preserve-sign" { | |
| ; CHECK: Function Attrs: denormal_fpenv(float: preservesign) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_f32_preserve_sign( | |
| ; CHECK-SAME: ) #[[ATTR6:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_f32_preserve_sign_preserve_sign() "denormal-fp-math-f32"="preserve-sign,preserve-sign" { | |
| ; CHECK: Function Attrs: denormal_fpenv(float: preservesign) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_f32_preserve_sign_preserve_sign( | |
| ; CHECK-SAME: ) #[[ATTR6]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_f32_dynamic() "denormal-fp-math-f32"="dynamic" { | |
| ; CHECK: Function Attrs: denormal_fpenv(float: dynamic) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_f32_dynamic( | |
| ; CHECK-SAME: ) #[[ATTR7:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_f32_dynamic_dynamic() "denormal-fp-math-f32"="dynamic,dynamic" { | |
| ; CHECK: Function Attrs: denormal_fpenv(float: dynamic) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_f32_dynamic_dynamic( | |
| ; CHECK-SAME: ) #[[ATTR7]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_f32_positivezero() "denormal-fp-math-f32"="positive-zero" { | |
| ; CHECK: Function Attrs: denormal_fpenv(float: positivezero) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_f32_positivezero( | |
| ; CHECK-SAME: ) #[[ATTR8:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_f32_positivezero_positivezero() "denormal-fp-math-f32"="positive-zero,positive-zero" { | |
| ; CHECK: Function Attrs: denormal_fpenv(float: positivezero) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_f32_positivezero_positivezero( | |
| ; CHECK-SAME: ) #[[ATTR8]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_f32_ieee_preservesign() "denormal-fp-math-f32"="ieee,preserve-sign" { | |
| ; CHECK: Function Attrs: denormal_fpenv(float: ieee|preservesign) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_f32_ieee_preservesign( | |
| ; CHECK-SAME: ) #[[ATTR9:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_f32_preservesign_ieee() "denormal-fp-math-f32"="preserve-sign,ieee" { | |
| ; CHECK: Function Attrs: denormal_fpenv(float: preservesign|ieee) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_f32_preservesign_ieee( | |
| ; CHECK-SAME: ) #[[ATTR10:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_ieee__denormal_fp_math_f32_ieee() "denormal-fp-math"="ieee" "denormal-fp-math-f32"="ieee" { | |
| ; CHECK: Function Attrs: denormal_fpenv(ieee) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_ieee__denormal_fp_math_f32_ieee( | |
| ; CHECK-SAME: ) #[[ATTR0]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_ieee__denormal_fp_math_f32_preserve_sign() "denormal-fp-math"="ieee" "denormal-fp-math-f32"="preserve-sign" { | |
| ; CHECK: Function Attrs: denormal_fpenv(float: preservesign) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_ieee__denormal_fp_math_f32_preserve_sign( | |
| ; CHECK-SAME: ) #[[ATTR6]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_ieee_ieee__denormal_fp_math_f32_preserve_sign_preserve_sign() "denormal-fp-math"="ieee,ieee" "denormal-fp-math-f32"="preserve-sign,preserve-sign" { | |
| ; CHECK: Function Attrs: denormal_fpenv(float: preservesign) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_ieee_ieee__denormal_fp_math_f32_preserve_sign_preserve_sign( | |
| ; CHECK-SAME: ) #[[ATTR6]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_ieee_ieee__denormal_fp_math_f32_preserve_sign_dynamic_dynamic() "denormal-fp-math"="ieee,ieee" "denormal-fp-math-f32"="dynamic,dynamic" { | |
| ; CHECK: Function Attrs: denormal_fpenv(float: dynamic) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_ieee_ieee__denormal_fp_math_f32_preserve_sign_dynamic_dynamic( | |
| ; CHECK-SAME: ) #[[ATTR7]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_dynamic_dynamic__denormal_fp_math_f32_preserve_sign_dynamic_dynamic() "denormal-fp-math"="dynamic,dynamic" "denormal-fp-math-f32"="dynamic,dynamic" { | |
| ; CHECK: Function Attrs: denormal_fpenv(dynamic) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_dynamic_dynamic__denormal_fp_math_f32_preserve_sign_dynamic_dynamic( | |
| ; CHECK-SAME: ) #[[ATTR2]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_dynamic_dynamic__denormal_fp_math_f32_preserve_sign_preserve_sign() "denormal-fp-math"="dynamic,dynamic" "denormal-fp-math-f32"="preserve-sign,preserve-sign" { | |
| ; CHECK: Function Attrs: denormal_fpenv(dynamic, float: preservesign) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_dynamic_dynamic__denormal_fp_math_f32_preserve_sign_preserve_sign( | |
| ; CHECK-SAME: ) #[[ATTR11:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| define void @str_denormal_fp_math_dynamic_positive_zero__denormal_fp_math_f32_preserve_sign_dynamic_preserve_sign() "denormal-fp-math"="dynamic,positive-zero" "denormal-fp-math-f32"="dynamic,preserve-sign" { | |
| ; CHECK: Function Attrs: denormal_fpenv(dynamic|positivezero, float: dynamic|preservesign) | |
| ; CHECK-LABEL: define void @str_denormal_fp_math_dynamic_positive_zero__denormal_fp_math_f32_preserve_sign_dynamic_preserve_sign( | |
| ; CHECK-SAME: ) #[[ATTR12:[0-9]+]] { | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ret void | |
| } | |
| declare void @func() | |
| ; These never did anything, but the new attribute fails the verifier | |
| ; on call sites. | |
| define void @ignore_callsite_attrs() { | |
| ; CHECK-LABEL: define void @ignore_callsite_attrs() { | |
| ; CHECK-NEXT: call void @func() #[[ATTR19:[0-9]+]] | |
| ; CHECK-NEXT: call void @func() #[[ATTR20:[0-9]+]] | |
| ; CHECK-NEXT: call void @func() #[[ATTR21:[0-9]+]] | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @func() "denormal-fp-math"="preserve-sign,preserve-sign" | |
| call void @func() "denormal-fp-math-f32"="preserve-sign,preserve-sign" | |
| call void @func() "denormal-fp-math"="dynamic,ieee" "denormal-fp-math-f32"="preserve-sign,preserve-sign" | |
| ret void | |
| } | |
| define float @test_denormal_fp_math_invalid1() "denormal-fp-math"="foo,ieee" { | |
| ; CHECK-LABEL: define float @test_denormal_fp_math_invalid1( | |
| ; CHECK-SAME: ) #[[ATTR13:[0-9]+]] { | |
| ; CHECK-NEXT: ret float 1.000000e+00 | |
| ; | |
| ret float 1.0 | |
| } | |
| define float @test_denormal_fp_math_invalid2() "denormal-fp-math"="ieee,ieee,ieee" { | |
| ; CHECK-LABEL: define float @test_denormal_fp_math_invalid2( | |
| ; CHECK-SAME: ) #[[ATTR14:[0-9]+]] { | |
| ; CHECK-NEXT: ret float 1.000000e+00 | |
| ; | |
| ret float 1.0 | |
| } | |
| define float @test_denormal_fp_math_f32_invalid() "denormal-fp-math-f32"="foo,ieee" { | |
| ; CHECK-LABEL: define float @test_denormal_fp_math_f32_invalid( | |
| ; CHECK-SAME: ) #[[ATTR15:[0-9]+]] { | |
| ; CHECK-NEXT: ret float 1.000000e+00 | |
| ; | |
| ret float 1.0 | |
| } | |
| define float @test_both_denormal_fp_math_invalid() "denormal-fp-math"="bar" "denormal-fp-math-f32"="foo,ieee" { | |
| ; CHECK-LABEL: define float @test_both_denormal_fp_math_invalid( | |
| ; CHECK-SAME: ) #[[ATTR16:[0-9]+]] { | |
| ; CHECK-NEXT: ret float 1.000000e+00 | |
| ; | |
| ret float 1.0 | |
| } | |
| define float @test_denormal_fp_math_invalid_with_invalid_f32() "denormal-fp-math"="dynamic,dynamic" "denormal-fp-math-f32"="foo,ieee" { | |
| ; CHECK: Function Attrs: denormal_fpenv(dynamic) | |
| ; CHECK-LABEL: define float @test_denormal_fp_math_invalid_with_invalid_f32( | |
| ; CHECK-SAME: ) #[[ATTR17:[0-9]+]] { | |
| ; CHECK-NEXT: ret float 1.000000e+00 | |
| ; | |
| ret float 1.0 | |
| } | |
| define float @test_invalid_denormal_fp_math_with_valid_f32() "denormal-fp-math"="foo,dynamic" "denormal-fp-math-f32"="dynamic,dynamic" { | |
| ; CHECK: Function Attrs: denormal_fpenv(float: dynamic) | |
| ; CHECK-LABEL: define float @test_invalid_denormal_fp_math_with_valid_f32( | |
| ; CHECK-SAME: ) #[[ATTR18:[0-9]+]] { | |
| ; CHECK-NEXT: ret float 1.000000e+00 | |
| ; | |
| ret float 1.0 | |
| } | |
| ;. | |
| ; CHECK: attributes #[[ATTR0]] = { denormal_fpenv(ieee) } | |
| ; CHECK: attributes #[[ATTR1]] = { denormal_fpenv(preservesign) } | |
| ; CHECK: attributes #[[ATTR2]] = { denormal_fpenv(dynamic) } | |
| ; CHECK: attributes #[[ATTR3]] = { denormal_fpenv(positivezero) } | |
| ; CHECK: attributes #[[ATTR4]] = { denormal_fpenv(ieee|preservesign) } | |
| ; CHECK: attributes #[[ATTR5]] = { denormal_fpenv(preservesign|ieee) } | |
| ; CHECK: attributes #[[ATTR6]] = { denormal_fpenv(float: preservesign) } | |
| ; CHECK: attributes #[[ATTR7]] = { denormal_fpenv(float: dynamic) } | |
| ; CHECK: attributes #[[ATTR8]] = { denormal_fpenv(float: positivezero) } | |
| ; CHECK: attributes #[[ATTR9]] = { denormal_fpenv(float: ieee|preservesign) } | |
| ; CHECK: attributes #[[ATTR10]] = { denormal_fpenv(float: preservesign|ieee) } | |
| ; CHECK: attributes #[[ATTR11]] = { denormal_fpenv(dynamic, float: preservesign) } | |
| ; CHECK: attributes #[[ATTR12]] = { denormal_fpenv(dynamic|positivezero, float: dynamic|preservesign) } | |
| ; CHECK: attributes #[[ATTR13]] = { "denormal-fp-math"="foo,ieee" } | |
| ; CHECK: attributes #[[ATTR14]] = { "denormal-fp-math"="ieee,ieee,ieee" } | |
| ; CHECK: attributes #[[ATTR15]] = { "denormal-fp-math-f32"="foo,ieee" } | |
| ; CHECK: attributes #[[ATTR16]] = { "denormal-fp-math"="bar" "denormal-fp-math-f32"="foo,ieee" } | |
| ; CHECK: attributes #[[ATTR17]] = { denormal_fpenv(dynamic) "denormal-fp-math-f32"="foo,ieee" } | |
| ; CHECK: attributes #[[ATTR18]] = { denormal_fpenv(float: dynamic) "denormal-fp-math"="foo,dynamic" } | |
| ; CHECK: attributes #[[ATTR19]] = { "denormal-fp-math"="preserve-sign,preserve-sign" } | |
| ; CHECK: attributes #[[ATTR20]] = { "denormal-fp-math-f32"="preserve-sign,preserve-sign" } | |
| ; CHECK: attributes #[[ATTR21]] = { "denormal-fp-math"="dynamic,ieee" "denormal-fp-math-f32"="preserve-sign,preserve-sign" } | |
| ;. |