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