llvm-project
15564a83 - [Mips] Add MipsPat `(MipsGPRel tglobaladdr:$in)` to select MipsISD::GPRel TargetGlobalAddress (#165531)

Commit
135 days ago
[Mips] Add MipsPat `(MipsGPRel tglobaladdr:$in)` to select MipsISD::GPRel TargetGlobalAddress (#165531) The original logic: ``` SelectionDAG has 17 nodes: t0: ch,glue = EntryToken t2: i64,ch = CopyFromReg t0, Register:i64 %0 t11: i32 = truncate t2 t14: i32 = and t11, Constant:i32<1> t20: i64 = MipsISD::GPRel TargetGlobalAddress:i64<ptr @.str.1> 0 [TF=3] t21: i64 = add Register:i64 $gp_64, t20 t16: i64 = MipsISD::GPRel TargetGlobalAddress:i64<ptr @.str> 0 [TF=3] t18: i64 = add Register:i64 $gp_64, t16 t7: i64 = select t14, t21, t18 ``` When SelectionDAG process visitSELECT, would fold select(cond, binop(x, y), binop(x, z)) to binop(x, select(cond, y, z)). As follows: ``` SelectionDAG has 16 nodes: t0: ch,glue = EntryToken t2: i64,ch = CopyFromReg t0, Register:i64 %0 t11: i32 = truncate t2 t14: i32 = and t11, Constant:i32<1> t20: i64 = MipsISD::GPRel TargetGlobalAddress:i64<ptr @.str.1> 0 [TF=3] t16: i64 = MipsISD::GPRel TargetGlobalAddress:i64<ptr @.str> 0 [TF=3] t22: i64 = select t14, t20, t16 t23: i64 = add Register:i64 $gp_64, t22 ``` Therefore, the original MipsPat `add GPR64:$gp, (MipsGPRel tglobaladdr:$in)` is no longer available. And there would be an assert: ``` ISEL: Starting selection on root node: t20: i64 = MipsISD::GPRel TargetGlobalAddress:i64<ptr @.str.1> 0 [TF=3] ISEL: Starting pattern match Initial Opcode index to 0 Match failed at index 0 LLVM ERROR: Cannot select: t20: i64 = MipsISD::GPRel TargetGlobalAddress:i64<ptr @.str.1> 0 [TF=3] ``` So we add a new MipsPat `def : MipsPat<(MipsGPRel tglobaladdr:$in), (DADDiu ZERO_64, tglobaladdr:$in)>, ISA_MIPS3, ABI_N64;` to parse MipsISD::GPRel TargetGlobalAddress. Fix #142060.
Author
Parents
Loading