Issue 159716
Summary [LegalizerHelper] Bug in insert position iterator
Labels new issue
Assignees
Reporter pratikashar
    For my custom backend, I've following GMIR input to legalizer:

```

  %1:_(s32) = COPY $r8
  %0:_(s16) = G_TRUNC %1:_(s32)
  %2:_(s16), %3:_ = G_SDIVREM %0:_, %0:_
  %4:_(s16) = G_INTRINSIC intrinsic(@llvm.custom.fma), %2:_(s16), %3:_(s16), %2:_(s16)
 %7:_(s32) = G_ANYEXT %4:_(s16)
  $r8 = COPY %7:_(s32)
```

I've following legalization rule for G_SDIVREM:

```
  getActionDefinitionsBuilder(
 {G_UDIVREM, G_SDIVREM})
      .clampScalar(0, s32, s64)
 .scalarize(0)
      .customFor({s32, s64});
```

Therefore, legalizer tries to widen G_SDIVREM operation to s32. Then, it inserts G_TRUNC to truncate %2, %3 so they can be consumed by the following llvm.custom.fma intrinsic.

The problem occurs with placement of G_TRUNC operations in LegalizerHelp.cpp. Here's the existing logic:

```
  case TargetOpcode::G_SDIVREM:
    Observer.changingInstr(MI);
 widenScalarSrc(MI, WideTy, 2, TargetOpcode::G_SEXT);
    widenScalarSrc(MI, WideTy, 3, TargetOpcode::G_SEXT);
    widenScalarDst(MI, WideTy);
 //MIRBuilder.setInsertPt(MIRBuilder.getMBB(), --MIRBuilder.getInsertPt());
 widenScalarDst(MI, WideTy, 1);
    Observer.changedInstr(MI);
    return Legalized;
```

After widening, we must insert 2 G_TRUNC operations. First G_TRUNC is inserted at correct position. widenScalarDst() increments next insertion position. Therefore, the second widenScalarDst() inserts 2nd G_TRUNC 1 instruction too late. This leads to following incorrect code:

```
  %2:_(s16) = G_TRUNC %10:_(s32)
  %4:_(s16) = G_INTRINSIC intrinsic(@llvm.custom.fma), %2:_(s16), %3:_(s16), %2:_(s16)
  %3:_(s16) = G_TRUNC %11:_(s32)
```

My proposed fix is in the comment above. This applies to G_UDIVREM as well.

To submit the patch, I need a test. But I'm unable to reproduce this on backends other than my custom backend. So what's the right way to submit this test?
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to