diff --git a/llvm/include/llvm/IR/IntrinsicsARM.td b/llvm/include/llvm/IR/IntrinsicsARM.td --- a/llvm/include/llvm/IR/IntrinsicsARM.td +++ b/llvm/include/llvm/IR/IntrinsicsARM.td @@ -817,9 +817,7 @@ def int_arm_neon_vcadd_rot270 : Neon_2Arg_Intrinsic; // GNU eabi mcount -def int_arm_gnu_eabi_mcount : Intrinsic<[], - [], - [IntrReadMem, IntrWriteMem]>; +def int_arm_gnu_eabi_mcount : Intrinsic<[], [], []>; def int_arm_mve_pred_i2v : Intrinsic< [llvm_anyvector_ty], [llvm_i32_ty], [IntrNoMem]>; diff --git a/llvm/include/llvm/IR/IntrinsicsX86.td b/llvm/include/llvm/IR/IntrinsicsX86.td --- a/llvm/include/llvm/IR/IntrinsicsX86.td +++ b/llvm/include/llvm/IR/IntrinsicsX86.td @@ -283,11 +283,10 @@ IntrHasSideEffects]>; def int_x86_sse_ldmxcsr : Intrinsic<[], [llvm_ptr_ty], - [IntrReadMem, IntrArgMemOnly, IntrHasSideEffects, // FIXME: LDMXCSR does not actually write to memory, - // but Fast and DAG Isel both use writing to memory - // as a proxy for having side effects. - IntrWriteMem]>; + // but intrinsic properties are generated incorrectly + // for IntrReadMem+IntrHasSideEffects. + [/*IntrReadMem,*/ IntrArgMemOnly, IntrHasSideEffects]>; } // Misc. diff --git a/llvm/test/tools/llvm-mca/X86/Atom/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/Atom/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/Atom/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/Atom/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 1 70 35.00 * divps (%rax), %xmm2 # CHECK-NEXT: 1 34 17.00 divss %xmm0, %xmm2 # CHECK-NEXT: 1 34 17.00 * divss (%rax), %xmm2 -# CHECK-NEXT: 1 5 2.50 * U ldmxcsr (%rax) +# CHECK-NEXT: 1 5 2.50 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 1 1.00 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 5 5.00 maxps %xmm0, %xmm2 # CHECK-NEXT: 1 5 5.00 * maxps (%rax), %xmm2 diff --git a/llvm/test/tools/llvm-mca/X86/Barcelona/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/Barcelona/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/Barcelona/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/Barcelona/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 2 20 14.00 * divps (%rax), %xmm2 # CHECK-NEXT: 1 14 14.00 divss %xmm0, %xmm2 # CHECK-NEXT: 2 20 14.00 * divss (%rax), %xmm2 -# CHECK-NEXT: 4 5 1.00 * U ldmxcsr (%rax) +# CHECK-NEXT: 4 5 1.00 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 1 1.00 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 3 1.00 maxps %xmm0, %xmm2 # CHECK-NEXT: 2 9 1.00 * maxps (%rax), %xmm2 diff --git a/llvm/test/tools/llvm-mca/X86/BdVer2/resources-avx1.s b/llvm/test/tools/llvm-mca/X86/BdVer2/resources-avx1.s --- a/llvm/test/tools/llvm-mca/X86/BdVer2/resources-avx1.s +++ b/llvm/test/tools/llvm-mca/X86/BdVer2/resources-avx1.s @@ -1218,7 +1218,7 @@ # CHECK-NEXT: 1 7 1.50 * vinsertps $1, (%rax), %xmm1, %xmm2 # CHECK-NEXT: 1 5 1.50 * vlddqu (%rax), %xmm2 # CHECK-NEXT: 2 5 1.50 * vlddqu (%rax), %ymm2 -# CHECK-NEXT: 1 5 0.50 * U vldmxcsr (%rax) +# CHECK-NEXT: 1 5 0.50 * * U vldmxcsr (%rax) # CHECK-NEXT: 1 1 1.50 * * U vmaskmovdqu %xmm0, %xmm1 # CHECK-NEXT: 1 6 2.00 * vmaskmovpd (%rax), %xmm0, %xmm2 # CHECK-NEXT: 2 6 2.00 * vmaskmovpd (%rax), %ymm0, %ymm2 diff --git a/llvm/test/tools/llvm-mca/X86/BdVer2/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/BdVer2/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/BdVer2/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/BdVer2/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 1 14 4.50 * divps (%rax), %xmm2 # CHECK-NEXT: 1 9 4.50 divss %xmm0, %xmm2 # CHECK-NEXT: 1 14 4.50 * divss (%rax), %xmm2 -# CHECK-NEXT: 1 5 0.50 * U ldmxcsr (%rax) +# CHECK-NEXT: 1 5 0.50 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 2 1.00 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 2 1.00 maxps %xmm0, %xmm2 # CHECK-NEXT: 1 7 1.50 * maxps (%rax), %xmm2 diff --git a/llvm/test/tools/llvm-mca/X86/Broadwell/resources-avx1.s b/llvm/test/tools/llvm-mca/X86/Broadwell/resources-avx1.s --- a/llvm/test/tools/llvm-mca/X86/Broadwell/resources-avx1.s +++ b/llvm/test/tools/llvm-mca/X86/Broadwell/resources-avx1.s @@ -1218,7 +1218,7 @@ # CHECK-NEXT: 2 6 1.00 * vinsertps $1, (%rax), %xmm1, %xmm2 # CHECK-NEXT: 1 5 0.50 * vlddqu (%rax), %xmm2 # CHECK-NEXT: 1 6 0.50 * vlddqu (%rax), %ymm2 -# CHECK-NEXT: 3 7 1.00 * U vldmxcsr (%rax) +# CHECK-NEXT: 3 7 1.00 * * U vldmxcsr (%rax) # CHECK-NEXT: 2 1 1.00 * * U vmaskmovdqu %xmm0, %xmm1 # CHECK-NEXT: 3 7 2.00 * vmaskmovpd (%rax), %xmm0, %xmm2 # CHECK-NEXT: 3 8 2.00 * vmaskmovpd (%rax), %ymm0, %ymm2 diff --git a/llvm/test/tools/llvm-mca/X86/Broadwell/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/Broadwell/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/Broadwell/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/Broadwell/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 2 16 5.00 * divps (%rax), %xmm2 # CHECK-NEXT: 1 11 3.00 divss %xmm0, %xmm2 # CHECK-NEXT: 2 16 5.00 * divss (%rax), %xmm2 -# CHECK-NEXT: 3 7 1.00 * U ldmxcsr (%rax) +# CHECK-NEXT: 3 7 1.00 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 1 1.00 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 3 1.00 maxps %xmm0, %xmm2 # CHECK-NEXT: 2 8 1.00 * maxps (%rax), %xmm2 diff --git a/llvm/test/tools/llvm-mca/X86/BtVer2/resources-avx1.s b/llvm/test/tools/llvm-mca/X86/BtVer2/resources-avx1.s --- a/llvm/test/tools/llvm-mca/X86/BtVer2/resources-avx1.s +++ b/llvm/test/tools/llvm-mca/X86/BtVer2/resources-avx1.s @@ -1218,7 +1218,7 @@ # CHECK-NEXT: 1 6 1.00 * vinsertps $1, (%rax), %xmm1, %xmm2 # CHECK-NEXT: 1 5 1.00 * vlddqu (%rax), %xmm2 # CHECK-NEXT: 2 5 2.00 * vlddqu (%rax), %ymm2 -# CHECK-NEXT: 1 3 1.00 * U vldmxcsr (%rax) +# CHECK-NEXT: 1 3 1.00 * * U vldmxcsr (%rax) # CHECK-NEXT: 63 34 21.00 * * U vmaskmovdqu %xmm0, %xmm1 # CHECK-NEXT: 1 6 1.00 * vmaskmovpd (%rax), %xmm0, %xmm2 # CHECK-NEXT: 2 6 2.00 * vmaskmovpd (%rax), %ymm0, %ymm2 diff --git a/llvm/test/tools/llvm-mca/X86/BtVer2/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/BtVer2/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/BtVer2/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/BtVer2/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 1 24 19.00 * divps (%rax), %xmm2 # CHECK-NEXT: 1 19 19.00 divss %xmm0, %xmm2 # CHECK-NEXT: 1 24 19.00 * divss (%rax), %xmm2 -# CHECK-NEXT: 1 3 1.00 * U ldmxcsr (%rax) +# CHECK-NEXT: 1 3 1.00 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 1 0.50 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 2 1.00 maxps %xmm0, %xmm2 # CHECK-NEXT: 1 7 1.00 * maxps (%rax), %xmm2 diff --git a/llvm/test/tools/llvm-mca/X86/BtVer2/stmxcsr-ldmxcsr.s b/llvm/test/tools/llvm-mca/X86/BtVer2/stmxcsr-ldmxcsr.s --- a/llvm/test/tools/llvm-mca/X86/BtVer2/stmxcsr-ldmxcsr.s +++ b/llvm/test/tools/llvm-mca/X86/BtVer2/stmxcsr-ldmxcsr.s @@ -33,7 +33,7 @@ # CHECK-NEXT: 1 1 0.50 movl $-24577, %eax # CHECK-NEXT: 1 4 1.00 * andl -4(%rsp), %eax # CHECK-NEXT: 1 1 1.00 * movl %eax, -8(%rsp) -# CHECK-NEXT: 1 3 1.00 * U ldmxcsr -8(%rsp) +# CHECK-NEXT: 1 3 1.00 * * U ldmxcsr -8(%rsp) # CHECK-NEXT: 1 4 1.00 U retq # CHECK: Resources: @@ -75,13 +75,13 @@ # CHECK-NEXT: [0,3] .D====eER . . . . movl %eax, -8(%rsp) # CHECK-NEXT: [0,4] . D===eeeER . . . ldmxcsr -8(%rsp) # CHECK-NEXT: [0,5] . DeeeeE--R . . . retq -# CHECK-NEXT: [1,0] . D===eE--R . . . stmxcsr -4(%rsp) +# CHECK-NEXT: [1,0] . D=====eER . . . stmxcsr -4(%rsp) # CHECK-NEXT: [1,1] . DeE-----R . . . movl $-24577, %eax # CHECK-NEXT: [1,2] . D====eeeeER. . . andl -4(%rsp), %eax # CHECK-NEXT: [1,3] . D========eER . . movl %eax, -8(%rsp) # CHECK-NEXT: [1,4] . D=======eeeER . . ldmxcsr -8(%rsp) # CHECK-NEXT: [1,5] . D=eeeeE-----R . . retq -# CHECK-NEXT: [2,0] . .D=======eE--R . . stmxcsr -4(%rsp) +# CHECK-NEXT: [2,0] . .D=========eER . . stmxcsr -4(%rsp) # CHECK-NEXT: [2,1] . .DeE---------R . . movl $-24577, %eax # CHECK-NEXT: [2,2] . . D========eeeeER . andl -4(%rsp), %eax # CHECK-NEXT: [2,3] . . D============eER . movl %eax, -8(%rsp) @@ -95,10 +95,10 @@ # CHECK-NEXT: [3]: Average time elapsed from WB until retire stage # CHECK: [0] [1] [2] [3] -# CHECK-NEXT: 0. 3 4.3 1.0 1.3 stmxcsr -4(%rsp) +# CHECK-NEXT: 0. 3 5.7 0.3 0.0 stmxcsr -4(%rsp) # CHECK-NEXT: 1. 3 1.0 1.0 4.7 movl $-24577, %eax # CHECK-NEXT: 2. 3 5.0 0.3 0.0 andl -4(%rsp), %eax # CHECK-NEXT: 3. 3 9.0 0.0 0.0 movl %eax, -8(%rsp) # CHECK-NEXT: 4. 3 8.0 0.0 0.0 ldmxcsr -8(%rsp) # CHECK-NEXT: 5. 3 1.7 1.7 5.3 retq -# CHECK-NEXT: 3 4.8 0.7 1.9 +# CHECK-NEXT: 3 5.1 0.6 1.7 diff --git a/llvm/test/tools/llvm-mca/X86/Generic/resources-avx1.s b/llvm/test/tools/llvm-mca/X86/Generic/resources-avx1.s --- a/llvm/test/tools/llvm-mca/X86/Generic/resources-avx1.s +++ b/llvm/test/tools/llvm-mca/X86/Generic/resources-avx1.s @@ -1218,7 +1218,7 @@ # CHECK-NEXT: 2 7 1.00 * vinsertps $1, (%rax), %xmm1, %xmm2 # CHECK-NEXT: 1 6 0.50 * vlddqu (%rax), %xmm2 # CHECK-NEXT: 1 7 0.50 * vlddqu (%rax), %ymm2 -# CHECK-NEXT: 4 5 1.00 * U vldmxcsr (%rax) +# CHECK-NEXT: 4 5 1.00 * * U vldmxcsr (%rax) # CHECK-NEXT: 1 1 1.00 * * U vmaskmovdqu %xmm0, %xmm1 # CHECK-NEXT: 3 8 1.00 * vmaskmovpd (%rax), %xmm0, %xmm2 # CHECK-NEXT: 3 9 1.00 * vmaskmovpd (%rax), %ymm0, %ymm2 diff --git a/llvm/test/tools/llvm-mca/X86/Generic/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/Generic/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/Generic/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/Generic/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 2 20 14.00 * divps (%rax), %xmm2 # CHECK-NEXT: 1 14 14.00 divss %xmm0, %xmm2 # CHECK-NEXT: 2 20 14.00 * divss (%rax), %xmm2 -# CHECK-NEXT: 4 5 1.00 * U ldmxcsr (%rax) +# CHECK-NEXT: 4 5 1.00 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 1 1.00 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 3 1.00 maxps %xmm0, %xmm2 # CHECK-NEXT: 2 9 1.00 * maxps (%rax), %xmm2 diff --git a/llvm/test/tools/llvm-mca/X86/Haswell/resources-avx1.s b/llvm/test/tools/llvm-mca/X86/Haswell/resources-avx1.s --- a/llvm/test/tools/llvm-mca/X86/Haswell/resources-avx1.s +++ b/llvm/test/tools/llvm-mca/X86/Haswell/resources-avx1.s @@ -1218,7 +1218,7 @@ # CHECK-NEXT: 2 7 1.00 * vinsertps $1, (%rax), %xmm1, %xmm2 # CHECK-NEXT: 1 6 0.50 * vlddqu (%rax), %xmm2 # CHECK-NEXT: 1 7 0.50 * vlddqu (%rax), %ymm2 -# CHECK-NEXT: 3 7 1.00 * U vldmxcsr (%rax) +# CHECK-NEXT: 3 7 1.00 * * U vldmxcsr (%rax) # CHECK-NEXT: 2 1 1.00 * * U vmaskmovdqu %xmm0, %xmm1 # CHECK-NEXT: 3 8 2.00 * vmaskmovpd (%rax), %xmm0, %xmm2 # CHECK-NEXT: 3 9 2.00 * vmaskmovpd (%rax), %ymm0, %ymm2 diff --git a/llvm/test/tools/llvm-mca/X86/Haswell/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/Haswell/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/Haswell/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/Haswell/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 2 19 7.00 * divps (%rax), %xmm2 # CHECK-NEXT: 1 13 7.00 divss %xmm0, %xmm2 # CHECK-NEXT: 2 18 7.00 * divss (%rax), %xmm2 -# CHECK-NEXT: 3 7 1.00 * U ldmxcsr (%rax) +# CHECK-NEXT: 3 7 1.00 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 1 1.00 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 3 1.00 maxps %xmm0, %xmm2 # CHECK-NEXT: 2 9 1.00 * maxps (%rax), %xmm2 diff --git a/llvm/test/tools/llvm-mca/X86/Haswell/stmxcsr-ldmxcsr.s b/llvm/test/tools/llvm-mca/X86/Haswell/stmxcsr-ldmxcsr.s --- a/llvm/test/tools/llvm-mca/X86/Haswell/stmxcsr-ldmxcsr.s +++ b/llvm/test/tools/llvm-mca/X86/Haswell/stmxcsr-ldmxcsr.s @@ -33,7 +33,7 @@ # CHECK-NEXT: 1 1 0.25 movl $-24577, %eax # CHECK-NEXT: 2 6 0.50 * andl -4(%rsp), %eax # CHECK-NEXT: 1 1 1.00 * movl %eax, -8(%rsp) -# CHECK-NEXT: 3 7 1.00 * U ldmxcsr -8(%rsp) +# CHECK-NEXT: 3 7 1.00 * * U ldmxcsr -8(%rsp) # CHECK-NEXT: 3 7 1.00 U retq # CHECK: Resources: @@ -50,16 +50,16 @@ # CHECK: Resource pressure per iteration: # CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] -# CHECK-NEXT: - - 1.75 1.74 1.67 1.68 2.00 1.75 1.76 1.65 +# CHECK-NEXT: - - 1.74 1.74 1.67 1.68 2.00 1.74 1.78 1.65 # CHECK: Resource pressure by instruction: # CHECK-NEXT: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] Instructions: # CHECK-NEXT: - - - - 0.30 - 1.00 1.00 - 0.70 stmxcsr -4(%rsp) -# CHECK-NEXT: - - 0.08 0.67 - - - 0.04 0.21 - movl $-24577, %eax -# CHECK-NEXT: - - 0.42 0.37 0.35 0.65 - 0.01 0.20 - andl -4(%rsp), %eax +# CHECK-NEXT: - - 0.03 0.53 - - - 0.23 0.21 - movl $-24577, %eax +# CHECK-NEXT: - - 0.22 0.58 0.35 0.65 - - 0.20 - andl -4(%rsp), %eax # CHECK-NEXT: - - - - 0.05 - 1.00 - - 0.95 movl %eax, -8(%rsp) -# CHECK-NEXT: - - 1.00 0.23 0.34 0.66 - 0.42 0.35 - ldmxcsr -8(%rsp) -# CHECK-NEXT: - - 0.25 0.47 0.63 0.37 - 0.28 1.00 - retq +# CHECK-NEXT: - - 1.00 0.21 0.34 0.66 - 0.42 0.37 - ldmxcsr -8(%rsp) +# CHECK-NEXT: - - 0.49 0.42 0.63 0.37 - 0.09 1.00 - retq # CHECK: Timeline view: # CHECK-NEXT: 0123456789 0123456789 @@ -71,14 +71,14 @@ # CHECK-NEXT: [0,3] .D======eER . . . . . . . movl %eax, -8(%rsp) # CHECK-NEXT: [0,4] . D=====eeeeeeeER . . . . . . ldmxcsr -8(%rsp) # CHECK-NEXT: [0,5] . DeeeeeeeE----R . . . . . . retq -# CHECK-NEXT: [1,0] . D====eeE----R . . . . . . stmxcsr -4(%rsp) -# CHECK-NEXT: [1,1] . DeE---------R . . . . . . movl $-24577, %eax +# CHECK-NEXT: [1,0] . D==========eeER . . . . . . stmxcsr -4(%rsp) +# CHECK-NEXT: [1,1] . DeE-----------R . . . . . . movl $-24577, %eax # CHECK-NEXT: [1,2] . D=========eeeeeeER . . . . . andl -4(%rsp), %eax # CHECK-NEXT: [1,3] . D===============eER . . . . . movl %eax, -8(%rsp) # CHECK-NEXT: [1,4] . .D==============eeeeeeeER. . . . ldmxcsr -8(%rsp) # CHECK-NEXT: [1,5] . . DeeeeeeeE-------------R. . . . retq -# CHECK-NEXT: [2,0] . . D=============eeE----R. . . . stmxcsr -4(%rsp) -# CHECK-NEXT: [2,1] . . DeE------------------R. . . . movl $-24577, %eax +# CHECK-NEXT: [2,0] . . D===================eeER . . . stmxcsr -4(%rsp) +# CHECK-NEXT: [2,1] . . DeE--------------------R . . . movl $-24577, %eax # CHECK-NEXT: [2,2] . . D==================eeeeeeER . . andl -4(%rsp), %eax # CHECK-NEXT: [2,3] . . D========================eER . . movl %eax, -8(%rsp) # CHECK-NEXT: [2,4] . . D=======================eeeeeeeER ldmxcsr -8(%rsp) @@ -91,10 +91,10 @@ # CHECK-NEXT: [3]: Average time elapsed from WB until retire stage # CHECK: [0] [1] [2] [3] -# CHECK-NEXT: 0. 3 6.7 1.0 2.7 stmxcsr -4(%rsp) -# CHECK-NEXT: 1. 3 1.0 1.0 9.3 movl $-24577, %eax +# CHECK-NEXT: 0. 3 10.7 0.3 0.0 stmxcsr -4(%rsp) +# CHECK-NEXT: 1. 3 1.0 1.0 10.7 movl $-24577, %eax # CHECK-NEXT: 2. 3 10.0 0.3 0.0 andl -4(%rsp), %eax # CHECK-NEXT: 3. 3 16.0 0.0 0.0 movl %eax, -8(%rsp) # CHECK-NEXT: 4. 3 15.0 0.0 0.0 ldmxcsr -8(%rsp) # CHECK-NEXT: 5. 3 1.0 1.0 13.0 retq -# CHECK-NEXT: 3 8.3 0.6 4.2 +# CHECK-NEXT: 3 8.9 0.4 3.9 diff --git a/llvm/test/tools/llvm-mca/X86/SLM/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/SLM/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/SLM/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/SLM/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 1 42 39.00 * divps (%rax), %xmm2 # CHECK-NEXT: 1 19 17.00 divss %xmm0, %xmm2 # CHECK-NEXT: 1 22 17.00 * divss (%rax), %xmm2 -# CHECK-NEXT: 1 3 1.00 * U ldmxcsr (%rax) +# CHECK-NEXT: 1 3 1.00 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 1 1.00 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 3 1.00 maxps %xmm0, %xmm2 # CHECK-NEXT: 1 6 1.00 * maxps (%rax), %xmm2 diff --git a/llvm/test/tools/llvm-mca/X86/SandyBridge/resources-avx1.s b/llvm/test/tools/llvm-mca/X86/SandyBridge/resources-avx1.s --- a/llvm/test/tools/llvm-mca/X86/SandyBridge/resources-avx1.s +++ b/llvm/test/tools/llvm-mca/X86/SandyBridge/resources-avx1.s @@ -1218,7 +1218,7 @@ # CHECK-NEXT: 2 7 1.00 * vinsertps $1, (%rax), %xmm1, %xmm2 # CHECK-NEXT: 1 6 0.50 * vlddqu (%rax), %xmm2 # CHECK-NEXT: 1 7 0.50 * vlddqu (%rax), %ymm2 -# CHECK-NEXT: 4 5 1.00 * U vldmxcsr (%rax) +# CHECK-NEXT: 4 5 1.00 * * U vldmxcsr (%rax) # CHECK-NEXT: 1 1 1.00 * * U vmaskmovdqu %xmm0, %xmm1 # CHECK-NEXT: 3 8 1.00 * vmaskmovpd (%rax), %xmm0, %xmm2 # CHECK-NEXT: 3 9 1.00 * vmaskmovpd (%rax), %ymm0, %ymm2 diff --git a/llvm/test/tools/llvm-mca/X86/SandyBridge/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/SandyBridge/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/SandyBridge/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/SandyBridge/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 2 20 14.00 * divps (%rax), %xmm2 # CHECK-NEXT: 1 14 14.00 divss %xmm0, %xmm2 # CHECK-NEXT: 2 20 14.00 * divss (%rax), %xmm2 -# CHECK-NEXT: 4 5 1.00 * U ldmxcsr (%rax) +# CHECK-NEXT: 4 5 1.00 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 1 1.00 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 3 1.00 maxps %xmm0, %xmm2 # CHECK-NEXT: 2 9 1.00 * maxps (%rax), %xmm2 diff --git a/llvm/test/tools/llvm-mca/X86/SkylakeClient/resources-avx1.s b/llvm/test/tools/llvm-mca/X86/SkylakeClient/resources-avx1.s --- a/llvm/test/tools/llvm-mca/X86/SkylakeClient/resources-avx1.s +++ b/llvm/test/tools/llvm-mca/X86/SkylakeClient/resources-avx1.s @@ -1218,7 +1218,7 @@ # CHECK-NEXT: 2 7 1.00 * vinsertps $1, (%rax), %xmm1, %xmm2 # CHECK-NEXT: 1 6 0.50 * vlddqu (%rax), %xmm2 # CHECK-NEXT: 1 7 0.50 * vlddqu (%rax), %ymm2 -# CHECK-NEXT: 3 7 1.00 * U vldmxcsr (%rax) +# CHECK-NEXT: 3 7 1.00 * * U vldmxcsr (%rax) # CHECK-NEXT: 2 1 1.00 * * U vmaskmovdqu %xmm0, %xmm1 # CHECK-NEXT: 2 7 0.50 * vmaskmovpd (%rax), %xmm0, %xmm2 # CHECK-NEXT: 2 8 0.50 * vmaskmovpd (%rax), %ymm0, %ymm2 diff --git a/llvm/test/tools/llvm-mca/X86/SkylakeClient/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/SkylakeClient/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/SkylakeClient/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/SkylakeClient/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 2 17 5.00 * divps (%rax), %xmm2 # CHECK-NEXT: 1 11 3.00 divss %xmm0, %xmm2 # CHECK-NEXT: 2 16 3.00 * divss (%rax), %xmm2 -# CHECK-NEXT: 3 7 1.00 * U ldmxcsr (%rax) +# CHECK-NEXT: 3 7 1.00 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 1 1.00 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 4 0.50 maxps %xmm0, %xmm2 # CHECK-NEXT: 2 10 0.50 * maxps (%rax), %xmm2 diff --git a/llvm/test/tools/llvm-mca/X86/SkylakeServer/resources-avx1.s b/llvm/test/tools/llvm-mca/X86/SkylakeServer/resources-avx1.s --- a/llvm/test/tools/llvm-mca/X86/SkylakeServer/resources-avx1.s +++ b/llvm/test/tools/llvm-mca/X86/SkylakeServer/resources-avx1.s @@ -1218,7 +1218,7 @@ # CHECK-NEXT: 2 7 1.00 * vinsertps $1, (%rax), %xmm1, %xmm2 # CHECK-NEXT: 1 6 0.50 * vlddqu (%rax), %xmm2 # CHECK-NEXT: 1 7 0.50 * vlddqu (%rax), %ymm2 -# CHECK-NEXT: 3 7 1.00 * U vldmxcsr (%rax) +# CHECK-NEXT: 3 7 1.00 * * U vldmxcsr (%rax) # CHECK-NEXT: 2 1 1.00 * * U vmaskmovdqu %xmm0, %xmm1 # CHECK-NEXT: 2 7 0.50 * vmaskmovpd (%rax), %xmm0, %xmm2 # CHECK-NEXT: 2 8 0.50 * vmaskmovpd (%rax), %ymm0, %ymm2 diff --git a/llvm/test/tools/llvm-mca/X86/SkylakeServer/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/SkylakeServer/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/SkylakeServer/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/SkylakeServer/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 2 17 5.00 * divps (%rax), %xmm2 # CHECK-NEXT: 1 11 3.00 divss %xmm0, %xmm2 # CHECK-NEXT: 2 16 3.00 * divss (%rax), %xmm2 -# CHECK-NEXT: 3 7 1.00 * U ldmxcsr (%rax) +# CHECK-NEXT: 3 7 1.00 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 1 1.00 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 4 0.50 maxps %xmm0, %xmm2 # CHECK-NEXT: 2 10 0.50 * maxps (%rax), %xmm2 diff --git a/llvm/test/tools/llvm-mca/X86/Znver1/resources-avx1.s b/llvm/test/tools/llvm-mca/X86/Znver1/resources-avx1.s --- a/llvm/test/tools/llvm-mca/X86/Znver1/resources-avx1.s +++ b/llvm/test/tools/llvm-mca/X86/Znver1/resources-avx1.s @@ -1218,7 +1218,7 @@ # CHECK-NEXT: 1 8 0.50 * vinsertps $1, (%rax), %xmm1, %xmm2 # CHECK-NEXT: 1 8 0.50 * vlddqu (%rax), %xmm2 # CHECK-NEXT: 1 8 0.50 * vlddqu (%rax), %ymm2 -# CHECK-NEXT: 1 100 0.25 * U vldmxcsr (%rax) +# CHECK-NEXT: 1 100 0.25 * * U vldmxcsr (%rax) # CHECK-NEXT: 1 100 0.25 * * U vmaskmovdqu %xmm0, %xmm1 # CHECK-NEXT: 1 8 0.50 * vmaskmovpd (%rax), %xmm0, %xmm2 # CHECK-NEXT: 2 8 1.00 * vmaskmovpd (%rax), %ymm0, %ymm2 diff --git a/llvm/test/tools/llvm-mca/X86/Znver1/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/Znver1/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/Znver1/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/Znver1/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 1 22 1.00 * divps (%rax), %xmm2 # CHECK-NEXT: 1 15 1.00 divss %xmm0, %xmm2 # CHECK-NEXT: 1 22 1.00 * divss (%rax), %xmm2 -# CHECK-NEXT: 1 100 0.25 * U ldmxcsr (%rax) +# CHECK-NEXT: 1 100 0.25 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 100 0.25 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 3 1.00 maxps %xmm0, %xmm2 # CHECK-NEXT: 1 10 1.00 * maxps (%rax), %xmm2 diff --git a/llvm/test/tools/llvm-mca/X86/Znver2/resources-avx1.s b/llvm/test/tools/llvm-mca/X86/Znver2/resources-avx1.s --- a/llvm/test/tools/llvm-mca/X86/Znver2/resources-avx1.s +++ b/llvm/test/tools/llvm-mca/X86/Znver2/resources-avx1.s @@ -1218,7 +1218,7 @@ # CHECK-NEXT: 1 8 0.50 * vinsertps $1, (%rax), %xmm1, %xmm2 # CHECK-NEXT: 1 8 0.33 * vlddqu (%rax), %xmm2 # CHECK-NEXT: 1 8 0.33 * vlddqu (%rax), %ymm2 -# CHECK-NEXT: 1 100 0.25 * U vldmxcsr (%rax) +# CHECK-NEXT: 1 100 0.25 * * U vldmxcsr (%rax) # CHECK-NEXT: 1 100 0.25 * * U vmaskmovdqu %xmm0, %xmm1 # CHECK-NEXT: 1 8 0.50 * vmaskmovpd (%rax), %xmm0, %xmm2 # CHECK-NEXT: 2 8 0.50 * vmaskmovpd (%rax), %ymm0, %ymm2 diff --git a/llvm/test/tools/llvm-mca/X86/Znver2/resources-sse1.s b/llvm/test/tools/llvm-mca/X86/Znver2/resources-sse1.s --- a/llvm/test/tools/llvm-mca/X86/Znver2/resources-sse1.s +++ b/llvm/test/tools/llvm-mca/X86/Znver2/resources-sse1.s @@ -230,7 +230,7 @@ # CHECK-NEXT: 1 22 1.00 * divps (%rax), %xmm2 # CHECK-NEXT: 1 15 1.00 divss %xmm0, %xmm2 # CHECK-NEXT: 1 22 1.00 * divss (%rax), %xmm2 -# CHECK-NEXT: 1 100 0.25 * U ldmxcsr (%rax) +# CHECK-NEXT: 1 100 0.25 * * U ldmxcsr (%rax) # CHECK-NEXT: 1 100 0.25 * * U maskmovq %mm0, %mm1 # CHECK-NEXT: 1 1 1.00 maxps %xmm0, %xmm2 # CHECK-NEXT: 1 8 1.00 * maxps (%rax), %xmm2 diff --git a/llvm/utils/TableGen/CodeGenTarget.cpp b/llvm/utils/TableGen/CodeGenTarget.cpp --- a/llvm/utils/TableGen/CodeGenTarget.cpp +++ b/llvm/utils/TableGen/CodeGenTarget.cpp @@ -821,11 +821,19 @@ void CodeGenIntrinsic::setProperty(Record *R) { if (R->getName() == "IntrNoMem") ModRef = NoMem; - else if (R->getName() == "IntrReadMem") + else if (R->getName() == "IntrReadMem") { + if (!(ModRef & MR_Ref)) + PrintFatalError(TheDef->getLoc(), + Twine("IntrReadMem cannot be used after IntrNoMem or " + "IntrWriteMem. Default is ReadWrite")); ModRef = ModRefBehavior(ModRef & ~MR_Mod); - else if (R->getName() == "IntrWriteMem") + } else if (R->getName() == "IntrWriteMem") { + if (!(ModRef & MR_Mod)) + PrintFatalError(TheDef->getLoc(), + Twine("IntrWriteMem cannot be used after IntrNoMem or " + "IntrReadMem. Default is ReadWrite")); ModRef = ModRefBehavior(ModRef & ~MR_Ref); - else if (R->getName() == "IntrArgMemOnly") + } else if (R->getName() == "IntrArgMemOnly") ModRef = ModRefBehavior((ModRef & ~MR_Anywhere) | MR_ArgMem); else if (R->getName() == "IntrInaccessibleMemOnly") ModRef = ModRefBehavior((ModRef & ~MR_Anywhere) | MR_InaccessibleMem);