[llvm] r203037 - Change math intrinsic attributes from readonly to readnone. These

Eric Christopher echristo at gmail.com
Wed Mar 5 16:44:52 PST 2014


Hi Raul,

This ended up breaking a clang codegen test: test/CodeGen/libcalls.c.
Can you take a look?

-eric

On Wed, Mar 5, 2014 at 4:18 PM, Raul E. Silvera <rsilvera at google.com> wrote:
> Author: rsilvera
> Date: Wed Mar  5 18:18:15 2014
> New Revision: 203037
>
> URL: http://llvm.org/viewvc/llvm-project?rev=203037&view=rev
> Log:
> Change math intrinsic attributes from readonly to readnone. These
> are operations that do not access memory but may be sensitive
> to floating-point environment changes. LLVM does not attempt
> to model FP environment changes, so this was unnecessarily conservative
> and was getting on the way of some optimizations, in particular
> SLP vectorization.
>
> Modified:
>     llvm/trunk/include/llvm/IR/Intrinsics.td
>     llvm/trunk/test/Feature/intrinsics.ll
>     llvm/trunk/test/Transforms/BBVectorize/simple-int.ll
>     llvm/trunk/test/Transforms/InstCombine/pow-1.ll
>
> Modified: llvm/trunk/include/llvm/IR/Intrinsics.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Intrinsics.td?rev=203037&r1=203036&r2=203037&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/Intrinsics.td (original)
> +++ llvm/trunk/include/llvm/IR/Intrinsics.td Wed Mar  5 18:18:15 2014
> @@ -285,10 +285,17 @@ def int_memset  : Intrinsic<[],
>                               llvm_i32_ty, llvm_i1_ty],
>                              [IntrReadWriteArgMem, NoCapture<0>]>;
>
> -// These functions do not actually read memory, but they are sensitive to the
> -// rounding mode.  This needs to be modelled separately; in the meantime
> -// declaring them as reading memory is conservatively correct.
> -let Properties = [IntrReadMem] in {
> +let Properties = [IntrNoMem] in {
> +  def int_fma  : Intrinsic<[llvm_anyfloat_ty],
> +                           [LLVMMatchType<0>, LLVMMatchType<0>,
> +                            LLVMMatchType<0>]>;
> +  def int_fmuladd : Intrinsic<[llvm_anyfloat_ty],
> +                              [LLVMMatchType<0>, LLVMMatchType<0>,
> +                               LLVMMatchType<0>]>;
> +
> +  // These functions do not read memory, but are sensitive to the
> +  // rounding mode. LLVM purposely does not model changes to the FP
> +  // environment so they can be treated as readnone.
>    def int_sqrt : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
>    def int_powi : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, llvm_i32_ty]>;
>    def int_sin  : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
> @@ -311,16 +318,6 @@ let Properties = [IntrReadMem] in {
>    def int_round : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
>  }
>
> -let Properties = [IntrNoMem] in {
> -  def int_fma  : Intrinsic<[llvm_anyfloat_ty],
> -                         [LLVMMatchType<0>, LLVMMatchType<0>,
> -                          LLVMMatchType<0>]>;
> -
> -  def int_fmuladd : Intrinsic<[llvm_anyfloat_ty],
> -                              [LLVMMatchType<0>, LLVMMatchType<0>,
> -                               LLVMMatchType<0>]>;
> -}
> -
>  // NOTE: these are internal interfaces.
>  def int_setjmp     : Intrinsic<[llvm_i32_ty],  [llvm_ptr_ty]>;
>  def int_longjmp    : Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty], [IntrNoReturn]>;
>
> Modified: llvm/trunk/test/Feature/intrinsics.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Feature/intrinsics.ll?rev=203037&r1=203036&r2=203037&view=diff
> ==============================================================================
> --- llvm/trunk/test/Feature/intrinsics.ll (original)
> +++ llvm/trunk/test/Feature/intrinsics.ll Wed Mar  5 18:18:15 2014
> @@ -61,7 +61,7 @@ define void @libm() {
>  ; FIXME: test ALL the intrinsics in this file.
>
>  ; rdar://11542750
> -; CHECK: declare void @llvm.trap() #2
> +; CHECK: declare void @llvm.trap() #1
>  declare void @llvm.trap()
>
>  define void @trap() {
> @@ -70,5 +70,4 @@ define void @trap() {
>  }
>
>  ; CHECK: attributes #0 = { nounwind readnone }
> -; CHECK: attributes #1 = { nounwind readonly }
> -; CHECK: attributes #2 = { noreturn nounwind }
> +; CHECK: attributes #1 = { noreturn nounwind }
>
> Modified: llvm/trunk/test/Transforms/BBVectorize/simple-int.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BBVectorize/simple-int.ll?rev=203037&r1=203036&r2=203037&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/BBVectorize/simple-int.ll (original)
> +++ llvm/trunk/test/Transforms/BBVectorize/simple-int.ll Wed Mar  5 18:18:15 2014
> @@ -126,8 +126,7 @@ define double @test4(double %A1, double
>
>  ; CHECK: declare <2 x double> @llvm.fma.v2f64(<2 x double>, <2 x double>, <2 x double>) #0
>  ; CHECK: declare <2 x double> @llvm.fmuladd.v2f64(<2 x double>, <2 x double>, <2 x double>) #0
> -; CHECK: declare <2 x double> @llvm.cos.v2f64(<2 x double>) #1
> -; CHECK: declare <2 x double> @llvm.powi.v2f64(<2 x double>, i32) #1
> +; CHECK: declare <2 x double> @llvm.cos.v2f64(<2 x double>) #0
> +; CHECK: declare <2 x double> @llvm.powi.v2f64(<2 x double>, i32) #0
>
>  ; CHECK: attributes #0 = { nounwind readnone }
> -; CHECK: attributes #1 = { nounwind readonly }
>
> Modified: llvm/trunk/test/Transforms/InstCombine/pow-1.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/pow-1.ll?rev=203037&r1=203036&r2=203037&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/pow-1.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/pow-1.ll Wed Mar  5 18:18:15 2014
> @@ -160,8 +160,8 @@ declare double @llvm.pow.f64(double %Val
>  define double @test_simplify17(double %x) {
>  ; CHECK-LABEL: @test_simplify17(
>    %retval = call double @llvm.pow.f64(double %x, double 0.5)
> -; CHECK-NEXT: [[SQRT:%[a-z0-9]+]] = call double @sqrt(double %x) [[NUW_RO]]
> -; CHECK-NEXT: [[FABS:%[a-z0-9]+]] = call double @fabs(double [[SQRT]]) [[NUW_RO]]
> +; CHECK-NEXT: [[SQRT:%[a-z0-9]+]] = call double @sqrt(double %x)
> +; CHECK-NEXT: [[FABS:%[a-z0-9]+]] = call double @fabs(double [[SQRT]])
>  ; CHECK-NEXT: [[FCMP:%[a-z0-9]+]] = fcmp oeq double %x, 0xFFF0000000000000
>  ; CHECK-NEXT: [[SELECT:%[a-z0-9]+]] = select i1 [[FCMP]], double 0x7FF0000000000000, double [[FABS]]
>    ret double %retval
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list