1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -instcombine < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" 3*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64-unknown-linux-gnu" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare <4 x double> @llvm.ppc.qpx.qvlfs(i8*) #1 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test1(<4 x float>* %h) #0 { 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker %h1 = getelementptr <4 x float>, <4 x float>* %h, i64 1 10*9880d681SAndroid Build Coastguard Worker %hv = bitcast <4 x float>* %h1 to i8* 11*9880d681SAndroid Build Coastguard Worker %vl = call <4 x double> @llvm.ppc.qpx.qvlfs(i8* %hv) 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 14*9880d681SAndroid Build Coastguard Worker; CHECK: @llvm.ppc.qpx.qvlfs 15*9880d681SAndroid Build Coastguard Worker; CHECK: ret <4 x double> 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker %v0 = load <4 x float>, <4 x float>* %h, align 8 18*9880d681SAndroid Build Coastguard Worker %v0e = fpext <4 x float> %v0 to <4 x double> 19*9880d681SAndroid Build Coastguard Worker %a = fadd <4 x double> %v0e, %vl 20*9880d681SAndroid Build Coastguard Worker ret <4 x double> %a 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test1a(<4 x float>* align 16 %h) #0 { 24*9880d681SAndroid Build Coastguard Workerentry: 25*9880d681SAndroid Build Coastguard Worker %h1 = getelementptr <4 x float>, <4 x float>* %h, i64 1 26*9880d681SAndroid Build Coastguard Worker %hv = bitcast <4 x float>* %h1 to i8* 27*9880d681SAndroid Build Coastguard Worker %vl = call <4 x double> @llvm.ppc.qpx.qvlfs(i8* %hv) 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1a 30*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @llvm.ppc.qpx.qvlfs 31*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load <4 x double> 32*9880d681SAndroid Build Coastguard Worker; CHECK: ret <4 x double> 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker %v0 = load <4 x float>, <4 x float>* %h, align 8 35*9880d681SAndroid Build Coastguard Worker %v0e = fpext <4 x float> %v0 to <4 x double> 36*9880d681SAndroid Build Coastguard Worker %a = fadd <4 x double> %v0e, %vl 37*9880d681SAndroid Build Coastguard Worker ret <4 x double> %a 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.ppc.qpx.qvstfs(<4 x double>, i8*) #0 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test2(<4 x float>* %h, <4 x double> %d) #0 { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker %h1 = getelementptr <4 x float>, <4 x float>* %h, i64 1 45*9880d681SAndroid Build Coastguard Worker %hv = bitcast <4 x float>* %h1 to i8* 46*9880d681SAndroid Build Coastguard Worker call void @llvm.ppc.qpx.qvstfs(<4 x double> %d, i8* %hv) 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker %v0 = load <4 x float>, <4 x float>* %h, align 8 49*9880d681SAndroid Build Coastguard Worker ret <4 x float> %v0 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2 52*9880d681SAndroid Build Coastguard Worker; CHECK: @llvm.ppc.qpx.qvstfs 53*9880d681SAndroid Build Coastguard Worker; CHECK: ret <4 x float> 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test2a(<4 x float>* align 16 %h, <4 x double> %d) #0 { 57*9880d681SAndroid Build Coastguard Workerentry: 58*9880d681SAndroid Build Coastguard Worker %h1 = getelementptr <4 x float>, <4 x float>* %h, i64 1 59*9880d681SAndroid Build Coastguard Worker %hv = bitcast <4 x float>* %h1 to i8* 60*9880d681SAndroid Build Coastguard Worker call void @llvm.ppc.qpx.qvstfs(<4 x double> %d, i8* %hv) 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker %v0 = load <4 x float>, <4 x float>* %h, align 8 63*9880d681SAndroid Build Coastguard Worker ret <4 x float> %v0 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2 66*9880d681SAndroid Build Coastguard Worker; CHECK: fptrunc <4 x double> %d to <4 x float> 67*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @llvm.ppc.qpx.qvstfs 68*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store <4 x double> 69*9880d681SAndroid Build Coastguard Worker; CHECK: ret <4 x float> 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdeclare <4 x double> @llvm.ppc.qpx.qvlfd(i8*) #1 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test1l(<4 x double>* %h) #0 { 75*9880d681SAndroid Build Coastguard Workerentry: 76*9880d681SAndroid Build Coastguard Worker %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1 77*9880d681SAndroid Build Coastguard Worker %hv = bitcast <4 x double>* %h1 to i8* 78*9880d681SAndroid Build Coastguard Worker %vl = call <4 x double> @llvm.ppc.qpx.qvlfd(i8* %hv) 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1l 81*9880d681SAndroid Build Coastguard Worker; CHECK: @llvm.ppc.qpx.qvlfd 82*9880d681SAndroid Build Coastguard Worker; CHECK: ret <4 x double> 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker %v0 = load <4 x double>, <4 x double>* %h, align 8 85*9880d681SAndroid Build Coastguard Worker %a = fadd <4 x double> %v0, %vl 86*9880d681SAndroid Build Coastguard Worker ret <4 x double> %a 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test1ln(<4 x double>* align 16 %h) #0 { 90*9880d681SAndroid Build Coastguard Workerentry: 91*9880d681SAndroid Build Coastguard Worker %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1 92*9880d681SAndroid Build Coastguard Worker %hv = bitcast <4 x double>* %h1 to i8* 93*9880d681SAndroid Build Coastguard Worker %vl = call <4 x double> @llvm.ppc.qpx.qvlfd(i8* %hv) 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1ln 96*9880d681SAndroid Build Coastguard Worker; CHECK: @llvm.ppc.qpx.qvlfd 97*9880d681SAndroid Build Coastguard Worker; CHECK: ret <4 x double> 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker %v0 = load <4 x double>, <4 x double>* %h, align 8 100*9880d681SAndroid Build Coastguard Worker %a = fadd <4 x double> %v0, %vl 101*9880d681SAndroid Build Coastguard Worker ret <4 x double> %a 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test1la(<4 x double>* align 32 %h) #0 { 105*9880d681SAndroid Build Coastguard Workerentry: 106*9880d681SAndroid Build Coastguard Worker %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1 107*9880d681SAndroid Build Coastguard Worker %hv = bitcast <4 x double>* %h1 to i8* 108*9880d681SAndroid Build Coastguard Worker %vl = call <4 x double> @llvm.ppc.qpx.qvlfd(i8* %hv) 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1la 111*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @llvm.ppc.qpx.qvlfd 112*9880d681SAndroid Build Coastguard Worker; CHECK: ret <4 x double> 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker %v0 = load <4 x double>, <4 x double>* %h, align 8 115*9880d681SAndroid Build Coastguard Worker %a = fadd <4 x double> %v0, %vl 116*9880d681SAndroid Build Coastguard Worker ret <4 x double> %a 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.ppc.qpx.qvstfd(<4 x double>, i8*) #0 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test2l(<4 x double>* %h, <4 x double> %d) #0 { 122*9880d681SAndroid Build Coastguard Workerentry: 123*9880d681SAndroid Build Coastguard Worker %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1 124*9880d681SAndroid Build Coastguard Worker %hv = bitcast <4 x double>* %h1 to i8* 125*9880d681SAndroid Build Coastguard Worker call void @llvm.ppc.qpx.qvstfd(<4 x double> %d, i8* %hv) 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker %v0 = load <4 x double>, <4 x double>* %h, align 8 128*9880d681SAndroid Build Coastguard Worker ret <4 x double> %v0 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2l 131*9880d681SAndroid Build Coastguard Worker; CHECK: @llvm.ppc.qpx.qvstfd 132*9880d681SAndroid Build Coastguard Worker; CHECK: ret <4 x double> 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test2ln(<4 x double>* align 16 %h, <4 x double> %d) #0 { 136*9880d681SAndroid Build Coastguard Workerentry: 137*9880d681SAndroid Build Coastguard Worker %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1 138*9880d681SAndroid Build Coastguard Worker %hv = bitcast <4 x double>* %h1 to i8* 139*9880d681SAndroid Build Coastguard Worker call void @llvm.ppc.qpx.qvstfd(<4 x double> %d, i8* %hv) 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker %v0 = load <4 x double>, <4 x double>* %h, align 8 142*9880d681SAndroid Build Coastguard Worker ret <4 x double> %v0 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2ln 145*9880d681SAndroid Build Coastguard Worker; CHECK: @llvm.ppc.qpx.qvstfd 146*9880d681SAndroid Build Coastguard Worker; CHECK: ret <4 x double> 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test2la(<4 x double>* align 32 %h, <4 x double> %d) #0 { 150*9880d681SAndroid Build Coastguard Workerentry: 151*9880d681SAndroid Build Coastguard Worker %h1 = getelementptr <4 x double>, <4 x double>* %h, i64 1 152*9880d681SAndroid Build Coastguard Worker %hv = bitcast <4 x double>* %h1 to i8* 153*9880d681SAndroid Build Coastguard Worker call void @llvm.ppc.qpx.qvstfd(<4 x double> %d, i8* %hv) 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker %v0 = load <4 x double>, <4 x double>* %h, align 8 156*9880d681SAndroid Build Coastguard Worker ret <4 x double> %v0 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2l 159*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: @llvm.ppc.qpx.qvstfd 160*9880d681SAndroid Build Coastguard Worker; CHECK: ret <4 x double> 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 164*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readonly } 165*9880d681SAndroid Build Coastguard Worker 166