1*67e74705SXin Li // Test that the GCC fast-math floating point flags get lowered to the correct 2*67e74705SXin Li // permutation of Clang frontend flags. This is non-trivial for a few reasons. 3*67e74705SXin Li // First, the GCC flags have many different and surprising effects. Second, 4*67e74705SXin Li // LLVM only supports three switches which is more coarse grained than GCC's 5*67e74705SXin Li // support. 6*67e74705SXin Li // 7*67e74705SXin Li // Both of them use gcc driver for as. 8*67e74705SXin Li // REQUIRES: clang-driver 9*67e74705SXin Li // 10*67e74705SXin Li // RUN: %clang -### -fno-honor-infinities -c %s 2>&1 \ 11*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-INFS %s 12*67e74705SXin Li // infinites [sic] is a supported alternative spelling of infinities. 13*67e74705SXin Li // RUN: %clang -### -fno-honor-infinites -c %s 2>&1 \ 14*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-INFS %s 15*67e74705SXin Li // CHECK-NO-INFS: "-cc1" 16*67e74705SXin Li // CHECK-NO-INFS: "-menable-no-infs" 17*67e74705SXin Li // 18*67e74705SXin Li // RUN: %clang -### -fno-fast-math -fno-honor-infinities -c %s 2>&1 \ 19*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-FAST-MATH-NO-INFS %s 20*67e74705SXin Li // CHECK-NO-FAST-MATH-NO-INFS: "-cc1" 21*67e74705SXin Li // CHECK-NO-FAST-MATH-NO-INFS: "-menable-no-infs" 22*67e74705SXin Li // 23*67e74705SXin Li // RUN: %clang -### -fno-honor-infinities -fno-fast-math -c %s 2>&1 \ 24*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-INFS-NO-FAST-MATH %s 25*67e74705SXin Li // CHECK-NO-INFS-NO-FAST-MATH: "-cc1" 26*67e74705SXin Li // CHECK-NO-INFS-NO-FAST-MATH-NOT: "-menable-no-infs" 27*67e74705SXin Li // 28*67e74705SXin Li // RUN: %clang -### -fno-signed-zeros -c %s 2>&1 \ 29*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-SIGNED-ZEROS %s 30*67e74705SXin Li // CHECK-NO-SIGNED-ZEROS: "-cc1" 31*67e74705SXin Li // CHECK-NO-SIGNED-ZEROS: "-fno-signed-zeros" 32*67e74705SXin Li // 33*67e74705SXin Li // RUN: %clang -### -fno-fast-math -fno-signed-zeros -c %s 2>&1 \ 34*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-FAST-MATH-NO-SIGNED-ZEROS %s 35*67e74705SXin Li // CHECK-NO-FAST-MATH-NO-SIGNED-ZEROS: "-cc1" 36*67e74705SXin Li // CHECK-NO-FAST-MATH-NO-SIGNED-ZEROS: "-fno-signed-zeros" 37*67e74705SXin Li // 38*67e74705SXin Li // RUN: %clang -### -fno-signed-zeros -fno-fast-math -c %s 2>&1 \ 39*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-SIGNED-ZEROS-NO-FAST-MATH %s 40*67e74705SXin Li // CHECK-NO-SIGNED-ZEROS-NO-FAST-MATH: "-cc1" 41*67e74705SXin Li // CHECK-NO-SIGNED-ZEROS-NO-FAST-MATH-NOT: "-fno-signed-zeros" 42*67e74705SXin Li // 43*67e74705SXin Li // RUN: %clang -### -freciprocal-math -c %s 2>&1 \ 44*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-RECIPROCAL-MATH %s 45*67e74705SXin Li // CHECK-RECIPROCAL-MATH: "-cc1" 46*67e74705SXin Li // CHECK-RECIPROCAL-MATH: "-freciprocal-math" 47*67e74705SXin Li // 48*67e74705SXin Li // RUN: %clang -### -fno-fast-math -freciprocal-math -c %s 2>&1 \ 49*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-FAST-MATH-RECIPROCAL-MATH %s 50*67e74705SXin Li // CHECK-NO-FAST-MATH-RECIPROCAL-MATH: "-cc1" 51*67e74705SXin Li // CHECK-NO-FAST-MATH-RECIPROCAL-MATH: "-freciprocal-math" 52*67e74705SXin Li // 53*67e74705SXin Li // RUN: %clang -### -freciprocal-math -fno-fast-math -c %s 2>&1 \ 54*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-RECIPROCAL-MATH-NO-FAST-MATH %s 55*67e74705SXin Li // CHECK-RECIPROCAL-MATH-NO-FAST-MATH: "-cc1" 56*67e74705SXin Li // CHECK-RECIPROCAL-MATH-NO-FAST-MATH-NOT: "-freciprocal-math" 57*67e74705SXin Li // 58*67e74705SXin Li // RUN: %clang -### -fno-honor-nans -c %s 2>&1 \ 59*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NANS %s 60*67e74705SXin Li // CHECK-NO-NANS: "-cc1" 61*67e74705SXin Li // CHECK-NO-NANS: "-menable-no-nans" 62*67e74705SXin Li // 63*67e74705SXin Li // RUN: %clang -### -fno-fast-math -fno-honor-nans -c %s 2>&1 \ 64*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-FAST-MATH-NO-NANS %s 65*67e74705SXin Li // CHECK-NO-FAST-MATH-NO-NANS: "-cc1" 66*67e74705SXin Li // CHECK-NO-FAST-MATH-NO-NANS: "-menable-no-nans" 67*67e74705SXin Li // 68*67e74705SXin Li // RUN: %clang -### -fno-honor-nans -fno-fast-math -c %s 2>&1 \ 69*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NANS-NO-FAST-MATH %s 70*67e74705SXin Li // CHECK-NO-NANS-NO-FAST-MATH: "-cc1" 71*67e74705SXin Li // CHECK-NO-NANS-NO-FAST-MATH-NOT: "-menable-no-nans" 72*67e74705SXin Li // 73*67e74705SXin Li // RUN: %clang -### -fmath-errno -c %s 2>&1 \ 74*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-MATH-ERRNO %s 75*67e74705SXin Li // CHECK-MATH-ERRNO: "-cc1" 76*67e74705SXin Li // CHECK-MATH-ERRNO: "-fmath-errno" 77*67e74705SXin Li // 78*67e74705SXin Li // RUN: %clang -### -fmath-errno -fno-math-errno -c %s 2>&1 \ 79*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-MATH-ERRNO %s 80*67e74705SXin Li // CHECK-NO-MATH-ERRNO: "-cc1" 81*67e74705SXin Li // CHECK-NO-MATH-ERRNO-NOT: "-fmath-errno" 82*67e74705SXin Li // 83*67e74705SXin Li // Target defaults for -fmath-errno (reusing the above checks). 84*67e74705SXin Li // RUN: %clang -### -target i686-unknown-linux -c %s 2>&1 \ 85*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-MATH-ERRNO %s 86*67e74705SXin Li // RUN: %clang -### -target i686-apple-darwin -c %s 2>&1 \ 87*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-MATH-ERRNO %s 88*67e74705SXin Li // RUN: %clang -### -target x86_64-unknown-freebsd -c %s 2>&1 \ 89*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-MATH-ERRNO %s 90*67e74705SXin Li // RUN: %clang -### -target x86_64-unknown-netbsd -c %s 2>&1 \ 91*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-MATH-ERRNO %s 92*67e74705SXin Li // RUN: %clang -### -target x86_64-unknown-openbsd -c %s 2>&1 \ 93*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-MATH-ERRNO %s 94*67e74705SXin Li // RUN: %clang -### -target x86_64-unknown-dragonfly -c %s 2>&1 \ 95*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-MATH-ERRNO %s 96*67e74705SXin Li // 97*67e74705SXin Li // Check that -ffast-math disables -fmath-errno, and -fno-fast-math merely 98*67e74705SXin Li // preserves the target default. Also check various flag set operations between 99*67e74705SXin Li // the two flags. (Resuses above checks.) 100*67e74705SXin Li // RUN: %clang -### -ffast-math -c %s 2>&1 \ 101*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-MATH-ERRNO %s 102*67e74705SXin Li // RUN: %clang -### -fmath-errno -ffast-math -c %s 2>&1 \ 103*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-MATH-ERRNO %s 104*67e74705SXin Li // RUN: %clang -### -ffast-math -fmath-errno -c %s 2>&1 \ 105*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-MATH-ERRNO %s 106*67e74705SXin Li // RUN: %clang -### -target i686-unknown-linux -fno-fast-math -c %s 2>&1 \ 107*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-MATH-ERRNO %s 108*67e74705SXin Li // RUN: %clang -### -target i686-unknown-linux -fno-math-errno -fno-fast-math -c %s 2>&1 \ 109*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-MATH-ERRNO %s 110*67e74705SXin Li // RUN: %clang -### -target i686-apple-darwin -fno-fast-math -c %s 2>&1 \ 111*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-MATH-ERRNO %s 112*67e74705SXin Li // RUN: %clang -### -target i686-apple-darwin -fno-math-errno -fno-fast-math -c %s 2>&1 \ 113*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-MATH-ERRNO %s 114*67e74705SXin Li // RUN: %clang -### -fno-fast-math -fno-math-errno -c %s 2>&1 \ 115*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-MATH-ERRNO %s 116*67e74705SXin Li // 117*67e74705SXin Li // RUN: %clang -### -fno-math-errno -fassociative-math -freciprocal-math \ 118*67e74705SXin Li // RUN: -fno-signed-zeros -fno-trapping-math -c %s 2>&1 \ 119*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-UNSAFE-MATH %s 120*67e74705SXin Li // CHECK-UNSAFE-MATH: "-cc1" 121*67e74705SXin Li // CHECK-UNSAFE-MATH: "-menable-unsafe-fp-math" 122*67e74705SXin Li // 123*67e74705SXin Li // RUN: %clang -### -fno-fast-math -fno-math-errno -fassociative-math -freciprocal-math \ 124*67e74705SXin Li // RUN: -fno-signed-zeros -fno-trapping-math -c %s 2>&1 \ 125*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-FAST-MATH-UNSAFE-MATH %s 126*67e74705SXin Li // CHECK-NO-FAST-MATH-UNSAFE-MATH: "-cc1" 127*67e74705SXin Li // CHECK-NO-FAST-MATH-UNSAFE-MATH: "-menable-unsafe-fp-math" 128*67e74705SXin Li // 129*67e74705SXin Li // RUN: %clang -### -fno-fast-math -fno-math-errno -fassociative-math -freciprocal-math \ 130*67e74705SXin Li // RUN: -fno-fast-math -fno-signed-zeros -fno-trapping-math -c %s 2>&1 \ 131*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-UNSAFE-MATH-NO-FAST-MATH %s 132*67e74705SXin Li // CHECK-UNSAFE-MATH-NO-FAST-MATH: "-cc1" 133*67e74705SXin Li // CHECK-UNSAFE-MATH-NO-FAST-MATH-NOT: "-menable-unsafe-fp-math" 134*67e74705SXin Li // 135*67e74705SXin Li // Check that various umbrella flags also enable these frontend options. 136*67e74705SXin Li // RUN: %clang -### -ffast-math -c %s 2>&1 \ 137*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-INFS %s 138*67e74705SXin Li // RUN: %clang -### -ffast-math -c %s 2>&1 \ 139*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NANS %s 140*67e74705SXin Li // RUN: %clang -### -ffast-math -c %s 2>&1 \ 141*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-UNSAFE-MATH %s 142*67e74705SXin Li // RUN: %clang -### -ffinite-math-only -c %s 2>&1 \ 143*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-INFS %s 144*67e74705SXin Li // RUN: %clang -### -ffinite-math-only -c %s 2>&1 \ 145*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NANS %s 146*67e74705SXin Li // RUN: %clang -### -funsafe-math-optimizations -fno-math-errno -c %s 2>&1 \ 147*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-UNSAFE-MATH %s 148*67e74705SXin Li // 149*67e74705SXin Li // One umbrella flag is *really* weird and also changes the semantics of the 150*67e74705SXin Li // program by adding a special preprocessor macro. Check that the frontend flag 151*67e74705SXin Li // modeling this semantic change is provided. Also check that the semantic 152*67e74705SXin Li // impact remains even if every optimization is disabled. 153*67e74705SXin Li // RUN: %clang -### -ffast-math -c %s 2>&1 \ 154*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-FAST-MATH %s 155*67e74705SXin Li // RUN: %clang -### -fno-fast-math -ffast-math -c %s 2>&1 \ 156*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-FAST-MATH %s 157*67e74705SXin Li // RUN: %clang -### -ffast-math -fno-finite-math-only \ 158*67e74705SXin Li // RUN: -fno-unsafe-math-optimizations -fmath-errno -c %s 2>&1 \ 159*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-FAST-MATH %s 160*67e74705SXin Li // CHECK-FAST-MATH: "-cc1" 161*67e74705SXin Li // CHECK-FAST-MATH: "-ffast-math" 162*67e74705SXin Li // 163*67e74705SXin Li // RUN: %clang -### -ffast-math -fno-fast-math -c %s 2>&1 \ 164*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-FAST-MATH %s 165*67e74705SXin Li // CHECK-NO-FAST-MATH: "-cc1" 166*67e74705SXin Li // CHECK-NO-FAST-MATH-NOT: "-ffast-math" 167*67e74705SXin Li // 168*67e74705SXin Li // Check various means of disabling these flags, including disabling them after 169*67e74705SXin Li // they've been enabled via an umbrella flag. 170*67e74705SXin Li // RUN: %clang -### -fno-honor-infinities -fhonor-infinities -c %s 2>&1 \ 171*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NO-INFS %s 172*67e74705SXin Li // RUN: %clang -### -ffinite-math-only -fhonor-infinities -c %s 2>&1 \ 173*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NO-INFS %s 174*67e74705SXin Li // RUN: %clang -### -ffinite-math-only -fno-finite-math-only -c %s 2>&1 \ 175*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NO-INFS %s 176*67e74705SXin Li // RUN: %clang -### -ffast-math -fhonor-infinities -c %s 2>&1 \ 177*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NO-INFS %s 178*67e74705SXin Li // RUN: %clang -### -ffast-math -fno-finite-math-only -c %s 2>&1 \ 179*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NO-INFS %s 180*67e74705SXin Li // CHECK-NO-NO-INFS: "-cc1" 181*67e74705SXin Li // CHECK-NO-NO-INFS-NOT: "-menable-no-infs" 182*67e74705SXin Li // CHECK-NO-NO-INFS: "-o" 183*67e74705SXin Li // 184*67e74705SXin Li // RUN: %clang -### -fno-honor-nans -fhonor-nans -c %s 2>&1 \ 185*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NO-NANS %s 186*67e74705SXin Li // RUN: %clang -### -ffinite-math-only -fhonor-nans -c %s 2>&1 \ 187*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NO-NANS %s 188*67e74705SXin Li // RUN: %clang -### -ffinite-math-only -fno-finite-math-only -c %s 2>&1 \ 189*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NO-NANS %s 190*67e74705SXin Li // RUN: %clang -### -ffast-math -fhonor-nans -c %s 2>&1 \ 191*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NO-NANS %s 192*67e74705SXin Li // RUN: %clang -### -ffast-math -fno-finite-math-only -c %s 2>&1 \ 193*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-NO-NANS %s 194*67e74705SXin Li // CHECK-NO-NO-NANS: "-cc1" 195*67e74705SXin Li // CHECK-NO-NO-NANS-NOT: "-menable-no-nans" 196*67e74705SXin Li // CHECK-NO-NO-NANS: "-o" 197*67e74705SXin Li // 198*67e74705SXin Li // RUN: %clang -### -fassociative-math -freciprocal-math -fno-signed-zeros \ 199*67e74705SXin Li // RUN: -fno-trapping-math -fno-associative-math -c %s 2>&1 \ 200*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 201*67e74705SXin Li // RUN: %clang -### -fassociative-math -freciprocal-math -fno-signed-zeros \ 202*67e74705SXin Li // RUN: -fno-trapping-math -fno-reciprocal-math -c %s 2>&1 \ 203*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 204*67e74705SXin Li // RUN: %clang -### -fassociative-math -freciprocal-math -fno-signed-zeros \ 205*67e74705SXin Li // RUN: -fno-trapping-math -fsigned-zeros -c %s 2>&1 \ 206*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 207*67e74705SXin Li // RUN: %clang -### -fassociative-math -freciprocal-math -fno-signed-zeros \ 208*67e74705SXin Li // RUN: -fno-trapping-math -ftrapping-math -c %s 2>&1 \ 209*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 210*67e74705SXin Li // RUN: %clang -### -funsafe-math-optimizations -fno-associative-math -c %s \ 211*67e74705SXin Li // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 212*67e74705SXin Li // RUN: %clang -### -funsafe-math-optimizations -fno-reciprocal-math -c %s \ 213*67e74705SXin Li // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 214*67e74705SXin Li // RUN: %clang -### -funsafe-math-optimizations -fsigned-zeros -c %s 2>&1 \ 215*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 216*67e74705SXin Li // RUN: %clang -### -funsafe-math-optimizations -ftrapping-math -c %s 2>&1 \ 217*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 218*67e74705SXin Li // RUN: %clang -### -funsafe-math-optimizations -fno-unsafe-math-optimizations \ 219*67e74705SXin Li // RUN: -c %s 2>&1 \ 220*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 221*67e74705SXin Li // RUN: %clang -### -ffast-math -fno-associative-math -c %s 2>&1 \ 222*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 223*67e74705SXin Li // RUN: %clang -### -ffast-math -fno-reciprocal-math -c %s 2>&1 \ 224*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 225*67e74705SXin Li // RUN: %clang -### -ffast-math -fsigned-zeros -c %s 2>&1 \ 226*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 227*67e74705SXin Li // RUN: %clang -### -ffast-math -ftrapping-math -c %s 2>&1 \ 228*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 229*67e74705SXin Li // RUN: %clang -### -ffast-math -fno-unsafe-math-optimizations -c %s 2>&1 \ 230*67e74705SXin Li // RUN: | FileCheck --check-prefix=CHECK-NO-UNSAFE-MATH %s 231*67e74705SXin Li // CHECK-NO-UNSAFE-MATH: "-cc1" 232*67e74705SXin Li // CHECK-NO-UNSAFE-MATH-NOT: "-menable-unsafe-fp-math" 233*67e74705SXin Li // CHECK-NO-UNSAFE-MATH: "-o" 234