@@ -2138,19 +2138,26 @@ def : GCNPat <
21382138/********** Immediate Patterns **********/
21392139/********** ================== **********/
21402140
2141+ // FIXME: Remove VGPRImm. Should be inferrable from register bank.
2142+
21412143def : GCNPat <
21422144 (VGPRImm<(i32 imm)>:$imm),
21432145 (V_MOV_B32_e32 imm:$imm)
21442146>;
21452147
21462148def : GCNPat <
2147- (VGPRImm<(f32 fpimm)> :$imm),
2148- (V_MOV_B32_e32 (f32 (bitcast_fpimm_to_i32 $imm)) )
2149+ (i32 imm :$imm),
2150+ (S_MOV_B32 imm: $imm)
21492151>;
21502152
21512153def : GCNPat <
2152- (i32 imm:$imm),
2153- (S_MOV_B32 imm:$imm)
2154+ (p5 frameindex:$fi),
2155+ (V_MOV_B32_e32 (p5 (frameindex_to_targetframeindex $fi)))
2156+ >;
2157+
2158+ def : GCNPat <
2159+ (p5 frameindex:$fi),
2160+ (S_MOV_B32 (p5 (frameindex_to_targetframeindex $fi)))
21542161>;
21552162
21562163def : GCNPat <
@@ -2174,15 +2181,13 @@ foreach pred = [NotHasTrue16BitInsts, UseFakeTrue16Insts] in {
21742181 // FIXME: Workaround for ordering issue with peephole optimizer where
21752182 // a register class copy interferes with immediate folding. Should
21762183 // use s_mov_b32, which can be shrunk to s_movk_i32
2177- def : GCNPat <
2178- (VGPRImm<(f16 fpimm)>:$imm),
2179- (V_MOV_B32_e32 (f16 (bitcast_fpimm_to_i32 $imm)))
2180- >;
21812184
2182- def : GCNPat <
2183- (VGPRImm<(bf16 fpimm)>:$imm),
2184- (V_MOV_B32_e32 (bf16 (bitcast_fpimm_to_i32 $imm)))
2185- >;
2185+ foreach vt = [f16, bf16] in {
2186+ def : GCNPat <
2187+ (VGPRImm<(f16 fpimm)>:$imm),
2188+ (V_MOV_B32_e32 (vt (bitcast_fpimm_to_i32 $imm)))
2189+ >;
2190+ }
21862191}
21872192
21882193let True16Predicate = UseRealTrue16Insts in {
@@ -2191,15 +2196,12 @@ let True16Predicate = UseRealTrue16Insts in {
21912196 (V_MOV_B16_t16_e64 0, imm:$imm, 0)
21922197 >;
21932198
2194- def : GCNPat <
2195- (VGPRImm<(f16 fpimm)>:$imm),
2196- (V_MOV_B16_t16_e64 0, $imm, 0)
2197- >;
2198-
2199- def : GCNPat <
2200- (VGPRImm<(bf16 fpimm)>:$imm),
2201- (V_MOV_B16_t16_e64 0, $imm, 0)
2202- >;
2199+ foreach vt = [f16, bf16] in {
2200+ def : GCNPat <
2201+ (VGPRImm<(vt fpimm)>:$imm),
2202+ (V_MOV_B16_t16_e64 0, $imm, 0)
2203+ >;
2204+ }
22032205}
22042206
22052207// V_MOV_B64_PSEUDO and S_MOV_B64_IMM_PSEUDO can be used with any 64-bit
@@ -2235,27 +2237,59 @@ def : GCNPat <
22352237 (S_MOV_B32 (i32 (bitcast_fpimm_to_i32 $imm)))
22362238>;
22372239
2240+ def : GCNPat <
2241+ (VGPRImm<(bf16 fpimm)>:$imm),
2242+ (V_MOV_B32_e32 (bf16 (bitcast_fpimm_to_i32 $imm)))
2243+ >;
2244+
22382245def : GCNPat <
22392246 (bf16 fpimm:$imm),
22402247 (S_MOV_B32 (i32 (bitcast_fpimm_to_i32 $imm)))
22412248>;
22422249
22432250def : GCNPat <
2244- (p5 frameindex:$fi ),
2245- (V_MOV_B32_e32 (p5 (frameindex_to_targetframeindex $fi )))
2251+ (VGPRImm<(f32 fpimm)>:$imm ),
2252+ (V_MOV_B32_e32 (f32 (bitcast_fpimm_to_i32 $imm )))
22462253>;
22472254
22482255def : GCNPat <
2249- (p5 frameindex:$fi),
2250- (S_MOV_B32 (p5 (frameindex_to_targetframeindex $fi)))
2256+ (f32 fpimm:$imm),
2257+ (S_MOV_B32 (f32 (bitcast_fpimm_to_i32 $imm)))
2258+ >;
2259+
2260+ def : GCNPat <
2261+ (VGPRImm<(i64 imm)>:$imm),
2262+ (V_MOV_B64_PSEUDO imm:$imm)
22512263>;
22522264
22532265def : GCNPat <
22542266 (i64 InlineImm64:$imm),
22552267 (S_MOV_B64 InlineImm64:$imm)
22562268>;
22572269
2258- // Set to sign-extended 64-bit value (true = -1, false = 0)
2270+ def : GCNPat <
2271+ (i64 imm:$imm),
2272+ (S_MOV_B64_IMM_PSEUDO imm:$imm)
2273+ >;
2274+
2275+ def : GCNPat <
2276+ (VGPRImm<(f64 fpimm)>:$imm),
2277+ (V_MOV_B64_PSEUDO (f64 (bitcast_fpimm_to_i64 $imm)))
2278+ >;
2279+
2280+ // V_MOV_B64_PSEUDO and S_MOV_B64_IMM_PSEUDO can be used with any 64-bit
2281+ // immediate and wil be expanded as needed, but we will only use these patterns
2282+ // for values which can be encoded.
2283+ def : GCNPat <
2284+ (f64 InlineImmFP64:$imm),
2285+ (S_MOV_B64 (i64 (bitcast_fpimm_to_i64 $imm)))
2286+ >;
2287+
2288+ def : GCNPat <
2289+ (f64 fpimm:$imm),
2290+ (S_MOV_B64_IMM_PSEUDO (i64 (bitcast_fpimm_to_i64 fpimm:$imm)))
2291+ >;
2292+
22592293// Set to sign-extended 64-bit value (true = -1, false = 0)
22602294def : GCNPat <(i1 imm:$imm),
22612295 (S_MOV_B64 imm:$imm)> {
@@ -2267,11 +2301,6 @@ def : GCNPat <(i1 imm:$imm),
22672301 let WaveSizePredicate = isWave32;
22682302}
22692303
2270- def : GCNPat <
2271- (f64 InlineImmFP64:$imm),
2272- (S_MOV_B64 (f64 (bitcast_fpimm_to_i64 InlineImmFP64:$imm)))
2273- >;
2274-
22752304/********** ================== **********/
22762305/********** Intrinsic Patterns **********/
22772306/********** ================== **********/
0 commit comments