1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s 3 4declare double @llvm.log.f64(double) 5declare double @llvm.exp.f64(double) 6declare double @llvm.log2.f64(double) 7declare double @llvm.exp2.f64(double) 8declare double @llvm.log10.f64(double) 9declare double @llvm.exp10.f64(double) 10 11define double @log_reassoc_exp_strict(double %a) { 12; CHECK-LABEL: @log_reassoc_exp_strict( 13; CHECK-NEXT: ret double [[A:%.*]] 14; 15 %1 = call double @llvm.exp.f64(double %a) 16 %2 = call reassoc double @llvm.log.f64(double %1) 17 ret double %2 18} 19 20define double @log_strict_exp_reassoc(double %a) { 21; CHECK-LABEL: @log_strict_exp_reassoc( 22; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.exp.f64(double [[A:%.*]]) 23; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.log.f64(double [[TMP1]]) 24; CHECK-NEXT: ret double [[TMP2]] 25; 26 %1 = call reassoc double @llvm.exp.f64(double %a) 27 %2 = call double @llvm.log.f64(double %1) 28 ret double %2 29} 30 31define double @log_exp_log_exp(double %a) { 32; CHECK-LABEL: @log_exp_log_exp( 33; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.exp.f64(double [[A:%.*]]) 34; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.log.f64(double [[TMP1]]) 35; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.exp.f64(double [[TMP2]]) 36; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.log.f64(double [[TMP3]]) 37; CHECK-NEXT: ret double [[TMP4]] 38; 39 %1 = call double @llvm.exp.f64(double %a) 40 %2 = call double @llvm.log.f64(double %1) 41 %3 = call double @llvm.exp.f64(double %2) 42 %4 = call double @llvm.log.f64(double %3) 43 ret double %4 44} 45 46define double @log_exp_log_exp_reassoc(double %a) { 47; CHECK-LABEL: @log_exp_log_exp_reassoc( 48; CHECK-NEXT: ret double [[A:%.*]] 49; 50 %1 = call double @llvm.exp.f64(double %a) 51 %2 = call reassoc double @llvm.log.f64(double %1) 52 %3 = call double @llvm.exp.f64(double %2) 53 %4 = call reassoc double @llvm.log.f64(double %3) 54 ret double %4 55} 56 57define double @log2_reassoc_exp2_strict(double %a) { 58; CHECK-LABEL: @log2_reassoc_exp2_strict( 59; CHECK-NEXT: ret double [[A:%.*]] 60; 61 %1 = call double @llvm.exp2.f64(double %a) 62 %2 = call reassoc double @llvm.log2.f64(double %1) 63 ret double %2 64} 65 66define double @log2_strict_exp2_reassoc(double %a) { 67; CHECK-LABEL: @log2_strict_exp2_reassoc( 68; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.exp2.f64(double [[A:%.*]]) 69; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.log2.f64(double [[TMP1]]) 70; CHECK-NEXT: ret double [[TMP2]] 71; 72 %1 = call reassoc double @llvm.exp2.f64(double %a) 73 %2 = call double @llvm.log2.f64(double %1) 74 ret double %2 75} 76 77define double @log2_exp2_log2_exp2(double %a) { 78; CHECK-LABEL: @log2_exp2_log2_exp2( 79; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.exp2.f64(double [[A:%.*]]) 80; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.log2.f64(double [[TMP1]]) 81; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.exp2.f64(double [[TMP2]]) 82; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.log2.f64(double [[TMP3]]) 83; CHECK-NEXT: ret double [[TMP4]] 84; 85 %1 = call double @llvm.exp2.f64(double %a) 86 %2 = call double @llvm.log2.f64(double %1) 87 %3 = call double @llvm.exp2.f64(double %2) 88 %4 = call double @llvm.log2.f64(double %3) 89 ret double %4 90} 91 92define double @log2_exp2_log2_exp2_reassoc(double %a) { 93; CHECK-LABEL: @log2_exp2_log2_exp2_reassoc( 94; CHECK-NEXT: ret double [[A:%.*]] 95; 96 %1 = call double @llvm.exp2.f64(double %a) 97 %2 = call reassoc double @llvm.log2.f64(double %1) 98 %3 = call double @llvm.exp2.f64(double %2) 99 %4 = call reassoc double @llvm.log2.f64(double %3) 100 ret double %4 101} 102 103define double @exp_reassoc_log_strict(double %a) { 104; CHECK-LABEL: @exp_reassoc_log_strict( 105; CHECK-NEXT: ret double [[A:%.*]] 106; 107 %1 = call double @llvm.log.f64(double %a) 108 %2 = call reassoc double @llvm.exp.f64(double %1) 109 ret double %2 110} 111 112define double @exp_strict_log_reassoc(double %a) { 113; CHECK-LABEL: @exp_strict_log_reassoc( 114; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.log.f64(double [[A:%.*]]) 115; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.exp.f64(double [[TMP1]]) 116; CHECK-NEXT: ret double [[TMP2]] 117; 118 %1 = call reassoc double @llvm.log.f64(double %a) 119 %2 = call double @llvm.exp.f64(double %1) 120 ret double %2 121} 122 123define double @exp_log_exp_log(double %a) { 124; CHECK-LABEL: @exp_log_exp_log( 125; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.log.f64(double [[A:%.*]]) 126; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.exp.f64(double [[TMP1]]) 127; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.log.f64(double [[TMP2]]) 128; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.exp.f64(double [[TMP3]]) 129; CHECK-NEXT: ret double [[TMP4]] 130; 131 %1 = call double @llvm.log.f64(double %a) 132 %2 = call double @llvm.exp.f64(double %1) 133 %3 = call double @llvm.log.f64(double %2) 134 %4 = call double @llvm.exp.f64(double %3) 135 ret double %4 136} 137 138define double @exp_log_exp_log_reassoc(double %a) { 139; CHECK-LABEL: @exp_log_exp_log_reassoc( 140; CHECK-NEXT: ret double [[A:%.*]] 141; 142 %1 = call double @llvm.log.f64(double %a) 143 %2 = call reassoc double @llvm.exp.f64(double %1) 144 %3 = call double @llvm.log.f64(double %2) 145 %4 = call reassoc double @llvm.exp.f64(double %3) 146 ret double %4 147} 148 149define double @exp2_reassoc_log2_strict(double %a) { 150; CHECK-LABEL: @exp2_reassoc_log2_strict( 151; CHECK-NEXT: ret double [[A:%.*]] 152; 153 %1 = call double @llvm.log2.f64(double %a) 154 %2 = call reassoc double @llvm.exp2.f64(double %1) 155 ret double %2 156} 157 158define double @exp2_strict_log2_reassoc(double %a) { 159; CHECK-LABEL: @exp2_strict_log2_reassoc( 160; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.log2.f64(double [[A:%.*]]) 161; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.exp2.f64(double [[TMP1]]) 162; CHECK-NEXT: ret double [[TMP2]] 163; 164 %1 = call reassoc double @llvm.log2.f64(double %a) 165 %2 = call double @llvm.exp2.f64(double %1) 166 ret double %2 167} 168 169define double @exp2_log2_exp2_log2(double %a) { 170; CHECK-LABEL: @exp2_log2_exp2_log2( 171; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.log2.f64(double [[A:%.*]]) 172; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.exp2.f64(double [[TMP1]]) 173; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.log2.f64(double [[TMP2]]) 174; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.exp2.f64(double [[TMP3]]) 175; CHECK-NEXT: ret double [[TMP4]] 176; 177 %1 = call double @llvm.log2.f64(double %a) 178 %2 = call double @llvm.exp2.f64(double %1) 179 %3 = call double @llvm.log2.f64(double %2) 180 %4 = call double @llvm.exp2.f64(double %3) 181 ret double %4 182} 183 184define double @exp2_log2_exp2_log2_reassoc(double %a) { 185; CHECK-LABEL: @exp2_log2_exp2_log2_reassoc( 186; CHECK-NEXT: ret double [[A:%.*]] 187; 188 %1 = call double @llvm.log2.f64(double %a) 189 %2 = call reassoc double @llvm.exp2.f64(double %1) 190 %3 = call double @llvm.log2.f64(double %2) 191 %4 = call reassoc double @llvm.exp2.f64(double %3) 192 ret double %4 193} 194 195define double @log10_reassoc_exp10_strict(double %a) { 196; CHECK-LABEL: @log10_reassoc_exp10_strict( 197; CHECK-NEXT: ret double [[A:%.*]] 198; 199 %1 = call double @llvm.exp10.f64(double %a) 200 %2 = call reassoc double @llvm.log10.f64(double %1) 201 ret double %2 202} 203 204define double @log10_strict_exp10_reassoc(double %a) { 205; CHECK-LABEL: @log10_strict_exp10_reassoc( 206; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.exp10.f64(double [[A:%.*]]) 207; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.log10.f64(double [[TMP1]]) 208; CHECK-NEXT: ret double [[TMP2]] 209; 210 %1 = call reassoc double @llvm.exp10.f64(double %a) 211 %2 = call double @llvm.log10.f64(double %1) 212 ret double %2 213} 214 215define double @log10_exp10_log10_exp10(double %a) { 216; CHECK-LABEL: @log10_exp10_log10_exp10( 217; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.exp10.f64(double [[A:%.*]]) 218; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.log10.f64(double [[TMP1]]) 219; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.exp10.f64(double [[TMP2]]) 220; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.log10.f64(double [[TMP3]]) 221; CHECK-NEXT: ret double [[TMP4]] 222; 223 %1 = call double @llvm.exp10.f64(double %a) 224 %2 = call double @llvm.log10.f64(double %1) 225 %3 = call double @llvm.exp10.f64(double %2) 226 %4 = call double @llvm.log10.f64(double %3) 227 ret double %4 228} 229 230define double @log10_exp10_log10_exp10_reassoc(double %a) { 231; CHECK-LABEL: @log10_exp10_log10_exp10_reassoc( 232; CHECK-NEXT: ret double [[A:%.*]] 233; 234 %1 = call double @llvm.exp10.f64(double %a) 235 %2 = call reassoc double @llvm.log10.f64(double %1) 236 %3 = call double @llvm.exp10.f64(double %2) 237 %4 = call reassoc double @llvm.log10.f64(double %3) 238 ret double %4 239} 240 241define double @exp10_reassoc_log10_strict(double %a) { 242; CHECK-LABEL: @exp10_reassoc_log10_strict( 243; CHECK-NEXT: ret double [[A:%.*]] 244; 245 %1 = call double @llvm.log10.f64(double %a) 246 %2 = call reassoc double @llvm.exp10.f64(double %1) 247 ret double %2 248} 249 250define double @exp10_strict_log10_reassoc(double %a) { 251; CHECK-LABEL: @exp10_strict_log10_reassoc( 252; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.log10.f64(double [[A:%.*]]) 253; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.exp10.f64(double [[TMP1]]) 254; CHECK-NEXT: ret double [[TMP2]] 255; 256 %1 = call reassoc double @llvm.log10.f64(double %a) 257 %2 = call double @llvm.exp10.f64(double %1) 258 ret double %2 259} 260 261define double @exp10_log10_exp10_log10(double %a) { 262; CHECK-LABEL: @exp10_log10_exp10_log10( 263; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.log10.f64(double [[A:%.*]]) 264; CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.exp10.f64(double [[TMP1]]) 265; CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.log10.f64(double [[TMP2]]) 266; CHECK-NEXT: [[TMP4:%.*]] = call double @llvm.exp10.f64(double [[TMP3]]) 267; CHECK-NEXT: ret double [[TMP4]] 268; 269 %1 = call double @llvm.log10.f64(double %a) 270 %2 = call double @llvm.exp10.f64(double %1) 271 %3 = call double @llvm.log10.f64(double %2) 272 %4 = call double @llvm.exp10.f64(double %3) 273 ret double %4 274} 275 276define double @exp10_log10_exp10_log10_reassoc(double %a) { 277; CHECK-LABEL: @exp10_log10_exp10_log10_reassoc( 278; CHECK-NEXT: ret double [[A:%.*]] 279; 280 %1 = call double @llvm.log10.f64(double %a) 281 %2 = call reassoc double @llvm.exp10.f64(double %1) 282 %3 = call double @llvm.log10.f64(double %2) 283 %4 = call reassoc double @llvm.exp10.f64(double %3) 284 ret double %4 285} 286 287define double @log2_reassoc_exp10_reassoc(double %a) { 288; CHECK-LABEL: @log2_reassoc_exp10_reassoc( 289; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.exp10.f64(double [[A:%.*]]) 290; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.log2.f64(double [[TMP1]]) 291; CHECK-NEXT: ret double [[TMP2]] 292; 293 %1 = call reassoc double @llvm.exp10.f64(double %a) 294 %2 = call reassoc double @llvm.log2.f64(double %1) 295 ret double %2 296} 297 298define double @log10_reassoc_exp2_reassoc(double %a) { 299; CHECK-LABEL: @log10_reassoc_exp2_reassoc( 300; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.exp2.f64(double [[A:%.*]]) 301; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.log10.f64(double [[TMP1]]) 302; CHECK-NEXT: ret double [[TMP2]] 303; 304 %1 = call reassoc double @llvm.exp2.f64(double %a) 305 %2 = call reassoc double @llvm.log10.f64(double %1) 306 ret double %2 307} 308 309define double @log10_reassoc_exp_reassoc(double %a) { 310; CHECK-LABEL: @log10_reassoc_exp_reassoc( 311; CHECK-NEXT: [[TMP1:%.*]] = call reassoc double @llvm.exp.f64(double [[A:%.*]]) 312; CHECK-NEXT: [[TMP2:%.*]] = call reassoc double @llvm.log10.f64(double [[TMP1]]) 313; CHECK-NEXT: ret double [[TMP2]] 314; 315 %1 = call reassoc double @llvm.exp.f64(double %a) 316 %2 = call reassoc double @llvm.log10.f64(double %1) 317 ret double %2 318} 319