| Davide Italiano | c8a7913 | 2015-11-03 20:32:23 +0000 | [diff] [blame] | 1 | ; RUN: opt < %s -instcombine -S | FileCheck %s | 
|  | 2 |  | 
| Sanjay Patel | 71e550f | 2016-01-12 16:50:17 +0000 | [diff] [blame^] | 3 | define double @pow_exp(double %x, double %y) #0 { | 
|  | 4 | %call = call fast double @exp(double %x) #0 | 
|  | 5 | %pow = call fast double @llvm.pow.f64(double %call, double %y) | 
|  | 6 | ret double %pow | 
|  | 7 | } | 
|  | 8 |  | 
|  | 9 | ; CHECK-LABEL: define double @pow_exp( | 
|  | 10 | ; CHECK-NEXT:  %mul = fmul fast double %x, %y | 
|  | 11 | ; CHECK-NEXT:  %exp = call fast double @exp(double %mul) | 
|  | 12 | ; CHECK-NEXT:  ret double %exp | 
|  | 13 |  | 
|  | 14 | ; FIXME: This should not be transformed because the 'exp' call is not fast. | 
|  | 15 | define double @pow_exp_not_fast(double %x, double %y) #0 { | 
| Davide Italiano | c8a7913 | 2015-11-03 20:32:23 +0000 | [diff] [blame] | 16 | %call = call double @exp(double %x) | 
| Sanjay Patel | 71e550f | 2016-01-12 16:50:17 +0000 | [diff] [blame^] | 17 | %pow = call fast double @llvm.pow.f64(double %call, double %y) | 
| Davide Italiano | c8a7913 | 2015-11-03 20:32:23 +0000 | [diff] [blame] | 18 | ret double %pow | 
|  | 19 | } | 
|  | 20 |  | 
| Sanjay Patel | 71e550f | 2016-01-12 16:50:17 +0000 | [diff] [blame^] | 21 | ; CHECK-LABEL: define double @pow_exp_not_fast( | 
|  | 22 | ; CHECK-NEXT:  %call = call double @exp(double %x) | 
|  | 23 | ; CHECK-NEXT:  %mul = fmul fast double %x, %y | 
|  | 24 | ; CHECK-NEXT:  %exp = call fast double @exp(double %mul) | 
|  | 25 | ; CHECK-NEXT:  ret double %exp | 
| Davide Italiano | c8a7913 | 2015-11-03 20:32:23 +0000 | [diff] [blame] | 26 |  | 
| Sanjay Patel | 71e550f | 2016-01-12 16:50:17 +0000 | [diff] [blame^] | 27 | define double @function_pointer(double ()* %fptr, double %p1) #0 { | 
|  | 28 | %call1 = call fast double %fptr() | 
|  | 29 | %pow = call fast double @llvm.pow.f64(double %call1, double %p1) | 
| Benjamin Kramer | fb419e7 | 2015-11-26 09:51:17 +0000 | [diff] [blame] | 30 | ret double %pow | 
|  | 31 | } | 
|  | 32 |  | 
| Sanjay Patel | 71e550f | 2016-01-12 16:50:17 +0000 | [diff] [blame^] | 33 | ; CHECK-LABEL: @function_pointer | 
|  | 34 | ; CHECK-NEXT:  %call1 = call fast double %fptr() | 
|  | 35 | ; CHECK-NEXT:  %pow = call fast double @llvm.pow.f64(double %call1, double %p1) | 
| Benjamin Kramer | fb419e7 | 2015-11-26 09:51:17 +0000 | [diff] [blame] | 36 |  | 
| Sanjay Patel | 71e550f | 2016-01-12 16:50:17 +0000 | [diff] [blame^] | 37 | declare double @exp(double) | 
| Davide Italiano | c8a7913 | 2015-11-03 20:32:23 +0000 | [diff] [blame] | 38 | declare double @llvm.pow.f64(double, double) | 
| Sanjay Patel | 71e550f | 2016-01-12 16:50:17 +0000 | [diff] [blame^] | 39 | attributes #0 = { "unsafe-fp-math"="true" nounwind readnone } | 
|  | 40 |  |