1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py 2; RUN: opt -cost-model -analyze -mtriple=thumbv8m.main < %s | FileCheck %s --check-prefix=V8M 3; RUN: opt -cost-model -analyze -mtriple=armv8a-linux-gnueabihf < %s | FileCheck %s --check-prefix=NEON 4; RUN: opt -cost-model -analyze -mtriple=armv8.1m.main -mattr=+mve < %s | FileCheck %s --check-prefix=MVE 5 6define i32 @reduce_i64(i32 %arg) { 7; V8M-LABEL: 'reduce_i64' 8; V8M-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V1 = call i64 @llvm.vector.reduce.umax.v1i64(<1 x i64> undef) 9; V8M-NEXT: Cost Model: Found an estimated cost of 13 for instruction: %V2 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> undef) 10; V8M-NEXT: Cost Model: Found an estimated cost of 35 for instruction: %V4 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> undef) 11; V8M-NEXT: Cost Model: Found an estimated cost of 79 for instruction: %V8 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> undef) 12; V8M-NEXT: Cost Model: Found an estimated cost of 167 for instruction: %V16 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> undef) 13; V8M-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef 14; 15; NEON-LABEL: 'reduce_i64' 16; NEON-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %V1 = call i64 @llvm.vector.reduce.umax.v1i64(<1 x i64> undef) 17; NEON-NEXT: Cost Model: Found an estimated cost of 17 for instruction: %V2 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> undef) 18; NEON-NEXT: Cost Model: Found an estimated cost of 31 for instruction: %V4 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> undef) 19; NEON-NEXT: Cost Model: Found an estimated cost of 76 for instruction: %V8 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> undef) 20; NEON-NEXT: Cost Model: Found an estimated cost of 178 for instruction: %V16 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> undef) 21; NEON-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 22; 23; MVE-LABEL: 'reduce_i64' 24; MVE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V1 = call i64 @llvm.vector.reduce.umax.v1i64(<1 x i64> undef) 25; MVE-NEXT: Cost Model: Found an estimated cost of 46 for instruction: %V2 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> undef) 26; MVE-NEXT: Cost Model: Found an estimated cost of 98 for instruction: %V4 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> undef) 27; MVE-NEXT: Cost Model: Found an estimated cost of 282 for instruction: %V8 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> undef) 28; MVE-NEXT: Cost Model: Found an estimated cost of 970 for instruction: %V16 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> undef) 29; MVE-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 30; 31 %V1 = call i64 @llvm.vector.reduce.umax.v1i64(<1 x i64> undef) 32 %V2 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> undef) 33 %V4 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> undef) 34 %V8 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> undef) 35 %V16 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> undef) 36 ret i32 undef 37} 38 39define i32 @reduce_i32(i32 %arg) { 40; V8M-LABEL: 'reduce_i32' 41; V8M-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %V2 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> undef) 42; V8M-NEXT: Cost Model: Found an estimated cost of 19 for instruction: %V4 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> undef) 43; V8M-NEXT: Cost Model: Found an estimated cost of 43 for instruction: %V8 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef) 44; V8M-NEXT: Cost Model: Found an estimated cost of 91 for instruction: %V16 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> undef) 45; V8M-NEXT: Cost Model: Found an estimated cost of 187 for instruction: %V32 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> undef) 46; V8M-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef 47; 48; NEON-LABEL: 'reduce_i32' 49; NEON-NEXT: Cost Model: Found an estimated cost of 17 for instruction: %V2 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> undef) 50; NEON-NEXT: Cost Model: Found an estimated cost of 55 for instruction: %V4 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> undef) 51; NEON-NEXT: Cost Model: Found an estimated cost of 81 for instruction: %V8 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef) 52; NEON-NEXT: Cost Model: Found an estimated cost of 133 for instruction: %V16 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> undef) 53; NEON-NEXT: Cost Model: Found an estimated cost of 237 for instruction: %V32 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> undef) 54; NEON-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 55; 56; MVE-LABEL: 'reduce_i32' 57; MVE-NEXT: Cost Model: Found an estimated cost of 42 for instruction: %V2 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> undef) 58; MVE-NEXT: Cost Model: Found an estimated cost of 140 for instruction: %V4 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> undef) 59; MVE-NEXT: Cost Model: Found an estimated cost of 240 for instruction: %V8 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef) 60; MVE-NEXT: Cost Model: Found an estimated cost of 632 for instruction: %V16 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> undef) 61; MVE-NEXT: Cost Model: Found an estimated cost of 2184 for instruction: %V32 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> undef) 62; MVE-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 63; 64 %V2 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> undef) 65 %V4 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> undef) 66 %V8 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef) 67 %V16 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> undef) 68 %V32 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> undef) 69 ret i32 undef 70} 71 72define i32 @reduce_i16(i32 %arg) { 73; V8M-LABEL: 'reduce_i16' 74; V8M-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %V2 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> undef) 75; V8M-NEXT: Cost Model: Found an estimated cost of 19 for instruction: %V4 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> undef) 76; V8M-NEXT: Cost Model: Found an estimated cost of 43 for instruction: %V8 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> undef) 77; V8M-NEXT: Cost Model: Found an estimated cost of 91 for instruction: %V16 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> undef) 78; V8M-NEXT: Cost Model: Found an estimated cost of 187 for instruction: %V32 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> undef) 79; V8M-NEXT: Cost Model: Found an estimated cost of 379 for instruction: %V64 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> undef) 80; V8M-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef 81; 82; NEON-LABEL: 'reduce_i16' 83; NEON-NEXT: Cost Model: Found an estimated cost of 17 for instruction: %V2 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> undef) 84; NEON-NEXT: Cost Model: Found an estimated cost of 55 for instruction: %V4 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> undef) 85; NEON-NEXT: Cost Model: Found an estimated cost of 153 for instruction: %V8 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> undef) 86; NEON-NEXT: Cost Model: Found an estimated cost of 203 for instruction: %V16 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> undef) 87; NEON-NEXT: Cost Model: Found an estimated cost of 303 for instruction: %V32 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> undef) 88; NEON-NEXT: Cost Model: Found an estimated cost of 503 for instruction: %V64 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> undef) 89; NEON-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 90; 91; MVE-LABEL: 'reduce_i16' 92; MVE-NEXT: Cost Model: Found an estimated cost of 42 for instruction: %V2 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> undef) 93; MVE-NEXT: Cost Model: Found an estimated cost of 140 for instruction: %V4 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> undef) 94; MVE-NEXT: Cost Model: Found an estimated cost of 788 for instruction: %V8 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> undef) 95; MVE-NEXT: Cost Model: Found an estimated cost of 1176 for instruction: %V16 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> undef) 96; MVE-NEXT: Cost Model: Found an estimated cost of 2720 for instruction: %V32 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> undef) 97; MVE-NEXT: Cost Model: Found an estimated cost of 8880 for instruction: %V64 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> undef) 98; MVE-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 99; 100 %V2 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> undef) 101 %V4 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> undef) 102 %V8 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> undef) 103 %V16 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> undef) 104 %V32 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> undef) 105 %V64 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> undef) 106 ret i32 undef 107} 108 109define i32 @reduce_i8(i32 %arg) { 110; V8M-LABEL: 'reduce_i8' 111; V8M-NEXT: Cost Model: Found an estimated cost of 7 for instruction: %V2 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> undef) 112; V8M-NEXT: Cost Model: Found an estimated cost of 19 for instruction: %V4 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> undef) 113; V8M-NEXT: Cost Model: Found an estimated cost of 43 for instruction: %V8 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> undef) 114; V8M-NEXT: Cost Model: Found an estimated cost of 91 for instruction: %V16 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> undef) 115; V8M-NEXT: Cost Model: Found an estimated cost of 187 for instruction: %V32 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> undef) 116; V8M-NEXT: Cost Model: Found an estimated cost of 379 for instruction: %V64 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> undef) 117; V8M-NEXT: Cost Model: Found an estimated cost of 763 for instruction: %V128 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> undef) 118; V8M-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef 119; 120; NEON-LABEL: 'reduce_i8' 121; NEON-NEXT: Cost Model: Found an estimated cost of 17 for instruction: %V2 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> undef) 122; NEON-NEXT: Cost Model: Found an estimated cost of 55 for instruction: %V4 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> undef) 123; NEON-NEXT: Cost Model: Found an estimated cost of 153 for instruction: %V8 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> undef) 124; NEON-NEXT: Cost Model: Found an estimated cost of 395 for instruction: %V16 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> undef) 125; NEON-NEXT: Cost Model: Found an estimated cost of 493 for instruction: %V32 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> undef) 126; NEON-NEXT: Cost Model: Found an estimated cost of 689 for instruction: %V64 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> undef) 127; NEON-NEXT: Cost Model: Found an estimated cost of 1081 for instruction: %V128 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> undef) 128; NEON-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 129; 130; MVE-LABEL: 'reduce_i8' 131; MVE-NEXT: Cost Model: Found an estimated cost of 42 for instruction: %V2 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> undef) 132; MVE-NEXT: Cost Model: Found an estimated cost of 140 for instruction: %V4 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> undef) 133; MVE-NEXT: Cost Model: Found an estimated cost of 788 for instruction: %V8 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> undef) 134; MVE-NEXT: Cost Model: Found an estimated cost of 4128 for instruction: %V16 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> undef) 135; MVE-NEXT: Cost Model: Found an estimated cost of 5668 for instruction: %V32 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> undef) 136; MVE-NEXT: Cost Model: Found an estimated cost of 11820 for instruction: %V64 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> undef) 137; MVE-NEXT: Cost Model: Found an estimated cost of 36412 for instruction: %V128 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> undef) 138; MVE-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef 139; 140 %V2 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> undef) 141 %V4 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> undef) 142 %V8 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> undef) 143 %V16 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> undef) 144 %V32 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> undef) 145 %V64 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> undef) 146 %V128 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> undef) 147 ret i32 undef 148} 149 150declare i64 @llvm.vector.reduce.umax.v1i64(<1 x i64>) 151declare i64 @llvm.vector.reduce.umax.v2i64(<2 x i64>) 152declare i64 @llvm.vector.reduce.umax.v4i64(<4 x i64>) 153declare i64 @llvm.vector.reduce.umax.v8i64(<8 x i64>) 154declare i64 @llvm.vector.reduce.umax.v16i64(<16 x i64>) 155 156declare i32 @llvm.vector.reduce.umax.v2i32(<2 x i32>) 157declare i32 @llvm.vector.reduce.umax.v4i32(<4 x i32>) 158declare i32 @llvm.vector.reduce.umax.v8i32(<8 x i32>) 159declare i32 @llvm.vector.reduce.umax.v16i32(<16 x i32>) 160declare i32 @llvm.vector.reduce.umax.v32i32(<32 x i32>) 161 162declare i16 @llvm.vector.reduce.umax.v2i16(<2 x i16>) 163declare i16 @llvm.vector.reduce.umax.v4i16(<4 x i16>) 164declare i16 @llvm.vector.reduce.umax.v8i16(<8 x i16>) 165declare i16 @llvm.vector.reduce.umax.v16i16(<16 x i16>) 166declare i16 @llvm.vector.reduce.umax.v32i16(<32 x i16>) 167declare i16 @llvm.vector.reduce.umax.v64i16(<64 x i16>) 168 169declare i8 @llvm.vector.reduce.umax.v2i8(<2 x i8>) 170declare i8 @llvm.vector.reduce.umax.v4i8(<4 x i8>) 171declare i8 @llvm.vector.reduce.umax.v8i8(<8 x i8>) 172declare i8 @llvm.vector.reduce.umax.v16i8(<16 x i8>) 173declare i8 @llvm.vector.reduce.umax.v32i8(<32 x i8>) 174declare i8 @llvm.vector.reduce.umax.v64i8(<64 x i8>) 175declare i8 @llvm.vector.reduce.umax.v128i8(<128 x i8>) 176