142902d22SZain Jaffal; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 242902d22SZain Jaffal; RUN: opt -S -passes=instcombine < %s | FileCheck %s 342902d22SZain Jaffal 442902d22SZain Jaffaldeclare double @llvm.sqrt.f64(double) 542902d22SZain Jaffal 642902d22SZain Jaffaldefine double @sqrt_div_fast(double %x, double %y, double %z) { 742902d22SZain Jaffal; CHECK-LABEL: @sqrt_div_fast( 842902d22SZain Jaffal; CHECK-NEXT: entry: 9f5811494SZain Jaffal; CHECK-NEXT: [[TMP0:%.*]] = fdiv fast double [[Z:%.*]], [[Y:%.*]] 10f5811494SZain Jaffal; CHECK-NEXT: [[TMP1:%.*]] = call fast double @llvm.sqrt.f64(double [[TMP0]]) 11*a1058776SNikita Popov; CHECK-NEXT: [[DIV1:%.*]] = fmul fast double [[X:%.*]], [[TMP1]] 1242902d22SZain Jaffal; CHECK-NEXT: ret double [[DIV1]] 1342902d22SZain Jaffal; 1442902d22SZain Jaffalentry: 1542902d22SZain Jaffal %div = fdiv fast double %y, %z 1642902d22SZain Jaffal %sqrt = call fast double @llvm.sqrt.f64(double %div) 1742902d22SZain Jaffal %div1 = fdiv fast double %x, %sqrt 1842902d22SZain Jaffal ret double %div1 1942902d22SZain Jaffal} 2042902d22SZain Jaffal 2142902d22SZain Jaffaldefine double @sqrt_div(double %x, double %y, double %z) { 2242902d22SZain Jaffal; CHECK-LABEL: @sqrt_div( 2342902d22SZain Jaffal; CHECK-NEXT: entry: 2442902d22SZain Jaffal; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[Y:%.*]], [[Z:%.*]] 2542902d22SZain Jaffal; CHECK-NEXT: [[SQRT:%.*]] = call double @llvm.sqrt.f64(double [[DIV]]) 2642902d22SZain Jaffal; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[X:%.*]], [[SQRT]] 2742902d22SZain Jaffal; CHECK-NEXT: ret double [[DIV1]] 2842902d22SZain Jaffal; 2942902d22SZain Jaffalentry: 3042902d22SZain Jaffal %div = fdiv double %y, %z 3142902d22SZain Jaffal %sqrt = call double @llvm.sqrt.f64(double %div) 3242902d22SZain Jaffal %div1 = fdiv double %x, %sqrt 3342902d22SZain Jaffal ret double %div1 3442902d22SZain Jaffal} 3542902d22SZain Jaffal 3642902d22SZain Jaffaldefine double @sqrt_div_reassoc_arcp(double %x, double %y, double %z) { 3742902d22SZain Jaffal; CHECK-LABEL: @sqrt_div_reassoc_arcp( 3842902d22SZain Jaffal; CHECK-NEXT: entry: 39f5811494SZain Jaffal; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc arcp double [[Z:%.*]], [[Y:%.*]] 40f5811494SZain Jaffal; CHECK-NEXT: [[TMP1:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[TMP0]]) 41*a1058776SNikita Popov; CHECK-NEXT: [[DIV1:%.*]] = fmul reassoc arcp double [[X:%.*]], [[TMP1]] 4242902d22SZain Jaffal; CHECK-NEXT: ret double [[DIV1]] 4342902d22SZain Jaffal; 4442902d22SZain Jaffalentry: 45e50189b0SZain Jaffal %div = fdiv arcp reassoc double %y, %z 46e50189b0SZain Jaffal %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div) 47e50189b0SZain Jaffal %div1 = fdiv arcp reassoc double %x, %sqrt 48e50189b0SZain Jaffal ret double %div1 49e50189b0SZain Jaffal} 50e50189b0SZain Jaffal 51e50189b0SZain Jaffaldefine double @sqrt_div_reassoc_missing(double %x, double %y, double %z) { 52e50189b0SZain Jaffal; CHECK-LABEL: @sqrt_div_reassoc_missing( 53e50189b0SZain Jaffal; CHECK-NEXT: entry: 54e50189b0SZain Jaffal; CHECK-NEXT: [[DIV:%.*]] = fdiv arcp double [[Y:%.*]], [[Z:%.*]] 55e50189b0SZain Jaffal; CHECK-NEXT: [[SQRT:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[DIV]]) 56e50189b0SZain Jaffal; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc arcp double [[X:%.*]], [[SQRT]] 57e50189b0SZain Jaffal; CHECK-NEXT: ret double [[DIV1]] 58e50189b0SZain Jaffal; 59e50189b0SZain Jaffalentry: 60e50189b0SZain Jaffal %div = fdiv arcp double %y, %z 61e50189b0SZain Jaffal %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div) 62e50189b0SZain Jaffal %div1 = fdiv arcp reassoc double %x, %sqrt 63e50189b0SZain Jaffal ret double %div1 64e50189b0SZain Jaffal} 65e50189b0SZain Jaffal 66e50189b0SZain Jaffaldefine double @sqrt_div_reassoc_missing2(double %x, double %y, double %z) { 67e50189b0SZain Jaffal; CHECK-LABEL: @sqrt_div_reassoc_missing2( 68e50189b0SZain Jaffal; CHECK-NEXT: entry: 69e50189b0SZain Jaffal; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]] 70e50189b0SZain Jaffal; CHECK-NEXT: [[SQRT:%.*]] = call arcp double @llvm.sqrt.f64(double [[DIV]]) 71e50189b0SZain Jaffal; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc arcp double [[X:%.*]], [[SQRT]] 72e50189b0SZain Jaffal; CHECK-NEXT: ret double [[DIV1]] 73e50189b0SZain Jaffal; 74e50189b0SZain Jaffalentry: 75e50189b0SZain Jaffal %div = fdiv arcp reassoc double %y, %z 76e50189b0SZain Jaffal %sqrt = call arcp double @llvm.sqrt.f64(double %div) 77e50189b0SZain Jaffal %div1 = fdiv arcp reassoc double %x, %sqrt 78e50189b0SZain Jaffal ret double %div1 79e50189b0SZain Jaffal} 80e50189b0SZain Jaffal 81e50189b0SZain Jaffaldefine double @sqrt_div_reassoc_missing3(double %x, double %y, double %z) { 82e50189b0SZain Jaffal; CHECK-LABEL: @sqrt_div_reassoc_missing3( 83e50189b0SZain Jaffal; CHECK-NEXT: entry: 84e50189b0SZain Jaffal; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]] 85e50189b0SZain Jaffal; CHECK-NEXT: [[SQRT:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[DIV]]) 86e50189b0SZain Jaffal; CHECK-NEXT: [[DIV1:%.*]] = fdiv arcp double [[X:%.*]], [[SQRT]] 87e50189b0SZain Jaffal; CHECK-NEXT: ret double [[DIV1]] 88e50189b0SZain Jaffal; 89e50189b0SZain Jaffalentry: 90e50189b0SZain Jaffal %div = fdiv arcp reassoc double %y, %z 91e50189b0SZain Jaffal %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div) 92e50189b0SZain Jaffal %div1 = fdiv arcp double %x, %sqrt 93e50189b0SZain Jaffal ret double %div1 94e50189b0SZain Jaffal} 95e50189b0SZain Jaffal 96e50189b0SZain Jaffaldefine double @sqrt_div_arcp_missing(double %x, double %y, double %z) { 97e50189b0SZain Jaffal; CHECK-LABEL: @sqrt_div_arcp_missing( 98e50189b0SZain Jaffal; CHECK-NEXT: entry: 99f5811494SZain Jaffal; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double [[Z:%.*]], [[Y:%.*]] 100f5811494SZain Jaffal; CHECK-NEXT: [[TMP1:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[TMP0]]) 101*a1058776SNikita Popov; CHECK-NEXT: [[DIV1:%.*]] = fmul reassoc arcp double [[X:%.*]], [[TMP1]] 102e50189b0SZain Jaffal; CHECK-NEXT: ret double [[DIV1]] 103e50189b0SZain Jaffal; 104e50189b0SZain Jaffalentry: 105e50189b0SZain Jaffal %div = fdiv reassoc double %y, %z 106e50189b0SZain Jaffal %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div) 107e50189b0SZain Jaffal %div1 = fdiv arcp reassoc double %x, %sqrt 108e50189b0SZain Jaffal ret double %div1 109e50189b0SZain Jaffal} 110e50189b0SZain Jaffal 111e50189b0SZain Jaffaldefine double @sqrt_div_arcp_missing2(double %x, double %y, double %z) { 112e50189b0SZain Jaffal; CHECK-LABEL: @sqrt_div_arcp_missing2( 113e50189b0SZain Jaffal; CHECK-NEXT: entry: 114e50189b0SZain Jaffal; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]] 115e50189b0SZain Jaffal; CHECK-NEXT: [[SQRT:%.*]] = call reassoc double @llvm.sqrt.f64(double [[DIV]]) 116e50189b0SZain Jaffal; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc arcp double [[X:%.*]], [[SQRT]] 117e50189b0SZain Jaffal; CHECK-NEXT: ret double [[DIV1]] 118e50189b0SZain Jaffal; 119e50189b0SZain Jaffalentry: 120e50189b0SZain Jaffal %div = fdiv arcp reassoc double %y, %z 121e50189b0SZain Jaffal %sqrt = call reassoc double @llvm.sqrt.f64(double %div) 122e50189b0SZain Jaffal %div1 = fdiv arcp reassoc double %x, %sqrt 123e50189b0SZain Jaffal ret double %div1 124e50189b0SZain Jaffal} 125e50189b0SZain Jaffal 126e50189b0SZain Jaffaldefine double @sqrt_div_arcp_missing3(double %x, double %y, double %z) { 127e50189b0SZain Jaffal; CHECK-LABEL: @sqrt_div_arcp_missing3( 128e50189b0SZain Jaffal; CHECK-NEXT: entry: 129e50189b0SZain Jaffal; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]] 130e50189b0SZain Jaffal; CHECK-NEXT: [[SQRT:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[DIV]]) 131e50189b0SZain Jaffal; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[X:%.*]], [[SQRT]] 132e50189b0SZain Jaffal; CHECK-NEXT: ret double [[DIV1]] 133e50189b0SZain Jaffal; 134e50189b0SZain Jaffalentry: 135e50189b0SZain Jaffal %div = fdiv arcp reassoc double %y, %z 136e50189b0SZain Jaffal %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div) 137e50189b0SZain Jaffal %div1 = fdiv reassoc double %x, %sqrt 13842902d22SZain Jaffal ret double %div1 13942902d22SZain Jaffal} 14042902d22SZain Jaffal 14142902d22SZain Jaffaldeclare void @use(double) 14242902d22SZain Jaffaldefine double @sqrt_div_fast_multiple_uses_1(double %x, double %y, double %z) { 14342902d22SZain Jaffal; CHECK-LABEL: @sqrt_div_fast_multiple_uses_1( 14442902d22SZain Jaffal; CHECK-NEXT: entry: 14542902d22SZain Jaffal; CHECK-NEXT: [[DIV:%.*]] = fdiv fast double [[Y:%.*]], [[Z:%.*]] 14642902d22SZain Jaffal; CHECK-NEXT: call void @use(double [[DIV]]) 14742902d22SZain Jaffal; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[DIV]]) 14842902d22SZain Jaffal; CHECK-NEXT: [[DIV1:%.*]] = fdiv fast double [[X:%.*]], [[SQRT]] 14942902d22SZain Jaffal; CHECK-NEXT: ret double [[DIV1]] 15042902d22SZain Jaffal; 15142902d22SZain Jaffalentry: 15242902d22SZain Jaffal %div = fdiv fast double %y, %z 15342902d22SZain Jaffal call void @use(double %div) 15442902d22SZain Jaffal %sqrt = call fast double @llvm.sqrt.f64(double %div) 15542902d22SZain Jaffal %div1 = fdiv fast double %x, %sqrt 15642902d22SZain Jaffal ret double %div1 15742902d22SZain Jaffal} 15842902d22SZain Jaffal 15942902d22SZain Jaffaldefine double @sqrt_div_fast_multiple_uses_2(double %x, double %y, double %z) { 16042902d22SZain Jaffal; CHECK-LABEL: @sqrt_div_fast_multiple_uses_2( 16142902d22SZain Jaffal; CHECK-NEXT: entry: 16242902d22SZain Jaffal; CHECK-NEXT: [[DIV:%.*]] = fdiv fast double [[Y:%.*]], [[Z:%.*]] 16342902d22SZain Jaffal; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[DIV]]) 16442902d22SZain Jaffal; CHECK-NEXT: call void @use(double [[SQRT]]) 16542902d22SZain Jaffal; CHECK-NEXT: [[DIV1:%.*]] = fdiv fast double [[X:%.*]], [[SQRT]] 16642902d22SZain Jaffal; CHECK-NEXT: ret double [[DIV1]] 16742902d22SZain Jaffal; 16842902d22SZain Jaffalentry: 16942902d22SZain Jaffal %div = fdiv fast double %y, %z 17042902d22SZain Jaffal %sqrt = call fast double @llvm.sqrt.f64(double %div) 17142902d22SZain Jaffal call void @use(double %sqrt) 17242902d22SZain Jaffal %div1 = fdiv fast double %x, %sqrt 17342902d22SZain Jaffal ret double %div1 17442902d22SZain Jaffal} 17542902d22SZain Jaffal 176f5811494SZain Jaffaldefine float @sqrt_non_div_operator(float %a) { 177f5811494SZain Jaffal; CHECK-LABEL: @sqrt_non_div_operator( 178f5811494SZain Jaffal; CHECK-NEXT: entry: 179f5811494SZain Jaffal; CHECK-NEXT: [[CONV:%.*]] = fpext float [[A:%.*]] to double 180f5811494SZain Jaffal; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[CONV]]) 181f5811494SZain Jaffal; CHECK-NEXT: [[DIV:%.*]] = fdiv fast double [[CONV]], [[SQRT]] 182f5811494SZain Jaffal; CHECK-NEXT: [[CONV2:%.*]] = fptrunc double [[DIV]] to float 183f5811494SZain Jaffal; CHECK-NEXT: ret float [[CONV2]] 184f5811494SZain Jaffal; 185f5811494SZain Jaffalentry: 186f5811494SZain Jaffal %conv = fpext float %a to double 187f5811494SZain Jaffal %sqrt = call fast double @llvm.sqrt.f64(double %conv) 188f5811494SZain Jaffal %div = fdiv fast double %conv, %sqrt 189f5811494SZain Jaffal %conv2 = fptrunc double %div to float 190f5811494SZain Jaffal ret float %conv2 191f5811494SZain Jaffal} 192