Krzysztof Parzyszek | bd8ef4b | 2016-08-19 13:34:31 +0000 | [diff] [blame] | 1 | ; RUN: llc -march=hexagon -fp-contract=fast -disable-hexagon-peephole -disable-hexagon-amodeopt < %s | FileCheck %s |
| 2 | |
| 3 | ; The test checks for various addressing modes for floating point loads/stores. |
| 4 | |
| 5 | %struct.matrix_paramsGlob = type { [50 x i8], i16, [50 x float] } |
| 6 | %struct.matrix_params = type { [50 x i8], i16, float** } |
| 7 | %struct.matrix_params2 = type { i16, [50 x [50 x float]] } |
| 8 | |
| 9 | @globB = common global %struct.matrix_paramsGlob zeroinitializer, align 4 |
| 10 | @globA = common global %struct.matrix_paramsGlob zeroinitializer, align 4 |
| 11 | @b = common global float 0.000000e+00, align 4 |
| 12 | @a = common global float 0.000000e+00, align 4 |
| 13 | |
| 14 | ; CHECK-LABEL: test1 |
Krzysztof Parzyszek | a72fad9 | 2017-02-10 15:33:13 +0000 | [diff] [blame] | 15 | ; CHECK: [[REG11:(r[0-9]+)]] = memw(r{{[0-9]+}}+r{{[0-9]+}}<<#2) |
Krzysztof Parzyszek | bd8ef4b | 2016-08-19 13:34:31 +0000 | [diff] [blame] | 16 | ; CHECK: [[REG12:(r[0-9]+)]] += sfmpy({{.*}}[[REG11]] |
Krzysztof Parzyszek | a72fad9 | 2017-02-10 15:33:13 +0000 | [diff] [blame] | 17 | ; CHECK: memw(r{{[0-9]+}}+r{{[0-9]+}}<<#2) = [[REG12]].new |
Krzysztof Parzyszek | bd8ef4b | 2016-08-19 13:34:31 +0000 | [diff] [blame] | 18 | |
| 19 | ; Function Attrs: norecurse nounwind |
| 20 | define void @test1(%struct.matrix_params* nocapture readonly %params, i32 %col1) { |
| 21 | entry: |
| 22 | %matrixA = getelementptr inbounds %struct.matrix_params, %struct.matrix_params* %params, i32 0, i32 2 |
| 23 | %0 = load float**, float*** %matrixA, align 4 |
| 24 | %arrayidx = getelementptr inbounds float*, float** %0, i32 2 |
| 25 | %1 = load float*, float** %arrayidx, align 4 |
| 26 | %arrayidx1 = getelementptr inbounds float, float* %1, i32 %col1 |
| 27 | %2 = load float, float* %arrayidx1, align 4 |
| 28 | %mul = fmul float %2, 2.000000e+01 |
| 29 | %add = fadd float %mul, 1.000000e+01 |
| 30 | %arrayidx3 = getelementptr inbounds float*, float** %0, i32 5 |
| 31 | %3 = load float*, float** %arrayidx3, align 4 |
| 32 | %arrayidx4 = getelementptr inbounds float, float* %3, i32 %col1 |
| 33 | store float %add, float* %arrayidx4, align 4 |
| 34 | ret void |
| 35 | } |
| 36 | |
| 37 | ; CHECK-LABEL: test2 |
Krzysztof Parzyszek | a72fad9 | 2017-02-10 15:33:13 +0000 | [diff] [blame] | 38 | ; CHECK: [[REG21:(r[0-9]+)]] = memw(##globB+92) |
Krzysztof Parzyszek | bd8ef4b | 2016-08-19 13:34:31 +0000 | [diff] [blame] | 39 | ; CHECK: [[REG22:(r[0-9]+)]] = sfadd({{.*}}[[REG21]] |
| 40 | ; CHECK: memw(##globA+84) = [[REG22]] |
| 41 | |
| 42 | ; Function Attrs: norecurse nounwind |
| 43 | define void @test2(%struct.matrix_params* nocapture readonly %params, i32 %col1) { |
| 44 | entry: |
| 45 | %matrixA = getelementptr inbounds %struct.matrix_params, %struct.matrix_params* %params, i32 0, i32 2 |
| 46 | %0 = load float**, float*** %matrixA, align 4 |
| 47 | %1 = load float*, float** %0, align 4 |
| 48 | %arrayidx1 = getelementptr inbounds float, float* %1, i32 %col1 |
| 49 | %2 = load float, float* %arrayidx1, align 4 |
| 50 | %3 = load float, float* getelementptr inbounds (%struct.matrix_paramsGlob, %struct.matrix_paramsGlob* @globB, i32 0, i32 2, i32 10), align 4 |
| 51 | %add = fadd float %2, %3 |
| 52 | store float %add, float* getelementptr inbounds (%struct.matrix_paramsGlob, %struct.matrix_paramsGlob* @globA, i32 0, i32 2, i32 8), align 4 |
| 53 | ret void |
| 54 | } |
| 55 | |
| 56 | ; CHECK-LABEL: test3 |
Krzysztof Parzyszek | a72fad9 | 2017-02-10 15:33:13 +0000 | [diff] [blame] | 57 | ; CHECK: [[REG31:(r[0-9]+)]] = memw(gp+#b) |
Krzysztof Parzyszek | bd8ef4b | 2016-08-19 13:34:31 +0000 | [diff] [blame] | 58 | ; CHECK: [[REG32:(r[0-9]+)]] = sfadd({{.*}}[[REG31]] |
Krzysztof Parzyszek | 5b4a6b6 | 2017-02-06 23:18:57 +0000 | [diff] [blame] | 59 | ; CHECK: memw(gp+#a) = [[REG32]] |
Krzysztof Parzyszek | bd8ef4b | 2016-08-19 13:34:31 +0000 | [diff] [blame] | 60 | |
| 61 | ; Function Attrs: norecurse nounwind |
| 62 | define void @test3(%struct.matrix_params* nocapture readonly %params, i32 %col1) { |
| 63 | entry: |
| 64 | %matrixA = getelementptr inbounds %struct.matrix_params, %struct.matrix_params* %params, i32 0, i32 2 |
| 65 | %0 = load float**, float*** %matrixA, align 4 |
| 66 | %1 = load float*, float** %0, align 4 |
| 67 | %arrayidx1 = getelementptr inbounds float, float* %1, i32 %col1 |
| 68 | %2 = load float, float* %arrayidx1, align 4 |
| 69 | %3 = load float, float* @b, align 4 |
| 70 | %add = fadd float %2, %3 |
| 71 | store float %add, float* @a, align 4 |
| 72 | ret void |
| 73 | } |
| 74 | |
| 75 | ; CHECK-LABEL: test4 |
Krzysztof Parzyszek | a72fad9 | 2017-02-10 15:33:13 +0000 | [diff] [blame] | 76 | ; CHECK: [[REG41:(r[0-9]+)]] = memw(r0<<#2+##globB+52) |
Krzysztof Parzyszek | bd8ef4b | 2016-08-19 13:34:31 +0000 | [diff] [blame] | 77 | ; CHECK: [[REG42:(r[0-9]+)]] = sfadd({{.*}}[[REG41]] |
Krzysztof Parzyszek | a72fad9 | 2017-02-10 15:33:13 +0000 | [diff] [blame] | 78 | ; CHECK: memw(r0<<#2+##globA+60) = [[REG42]] |
Krzysztof Parzyszek | bd8ef4b | 2016-08-19 13:34:31 +0000 | [diff] [blame] | 79 | ; Function Attrs: noinline norecurse nounwind |
| 80 | define void @test4(i32 %col1) { |
| 81 | entry: |
| 82 | %arrayidx = getelementptr inbounds %struct.matrix_paramsGlob, %struct.matrix_paramsGlob* @globB, i32 0, i32 2, i32 %col1 |
| 83 | %0 = load float, float* %arrayidx, align 4 |
| 84 | %add = fadd float %0, 0.000000e+00 |
| 85 | %add1 = add nsw i32 %col1, 2 |
| 86 | %arrayidx2 = getelementptr inbounds %struct.matrix_paramsGlob, %struct.matrix_paramsGlob* @globA, i32 0, i32 2, i32 %add1 |
| 87 | store float %add, float* %arrayidx2, align 4 |
| 88 | ret void |
| 89 | } |