[PATCH] D34095: [DAG] Prevent CombineTo from deleting already deleted nodes

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 10 11:44:48 PDT 2017


LGTM!

Nirav Dave via Phabricator <reviews at reviews.llvm.org> writes:
> niravd updated this revision to Diff 105410.
> niravd added a comment.
>
> Rewrite to avoid checking opcode of deleted nodes.
>
>
> https://reviews.llvm.org/D34095
>
> Files:
>   lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>   test/CodeGen/X86/pr32515.ll
>
> Index: test/CodeGen/X86/pr32515.ll
> ===================================================================
> --- /dev/null
> +++ test/CodeGen/X86/pr32515.ll
> @@ -0,0 +1,29 @@
> +; RUN: llc -O0 -mtriple=x86_64-unknown -mcpu=skx -o - %s
> +; RUN: llc     -mtriple=x86_64-unknown -mcpu=skx -o - %s
> +; RUN: llc -O0 -mtriple=i686-unknown   -mcpu=skx -o - %s
> +; RUN: llc     -mtriple=i686-unknown   -mcpu=skx -o - %s
> +; REQUIRES: asserts
> +
> + at var_26 = external global i16, align 2
> +
> +define void @foo() #0 {
> + %1 = alloca i16, align 2
> + %2 = load i16, i16* @var_26, align 2
> + %3 = zext i16 %2 to i32
> + %4 = icmp ne i32 %3, 7
> + %5 = zext i1 %4 to i16
> + store i16 %5, i16* %1, align 2
> + %6 = load i16, i16* @var_26, align 2
> + %7 = zext i16 %6 to i32
> + %8 = and i32 1, %7
> + %9 = shl i32 %8, 0
> + %10 = load i16, i16* @var_26, align 2
> + %11 = zext i16 %10 to i32
> + %12 = icmp ne i32 %11, 7
> + %13 = zext i1 %12 to i32
> + %14 = and i32 %9, %13
> + %15 = icmp ne i32 %14, 0
> + %16 = zext i1 %15 to i8
> + store i8 %16, i8* undef, align 1
> + unreachable
> + }
> Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> ===================================================================
> --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> +++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> @@ -7134,7 +7134,11 @@
>        SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SDLoc(N0),
>                                    N0.getValueType(), ExtLoad);
>        ExtendSetCCUses(SetCCs, Trunc, ExtLoad, DL, ISD::SIGN_EXTEND);
> -      CombineTo(N0.getNode(), Trunc, ExtLoad.getValue(1));
> +      // If the load value is used only by N, replace it via CombineTo N.
> +      if (N0.getValue(0).hasOneUse())
> +        DAG.ReplaceAllUsesOfValueWith(SDValue(N0, 1), ExtLoad.getValue(1));
> +      else
> +        CombineTo(LN0, Trunc, ExtLoad.getValue(1));
>        return CombineTo(N, ExtLoad); // Return N so it doesn't get rechecked!
>      }
>    }
> @@ -7192,7 +7196,11 @@
>                                      SDLoc(N0.getOperand(0)),
>                                      N0.getOperand(0).getValueType(), ExtLoad);
>          ExtendSetCCUses(SetCCs, Trunc, ExtLoad, DL, ISD::SIGN_EXTEND);
> -        CombineTo(N0.getOperand(0).getNode(), Trunc, ExtLoad.getValue(1));
> +        // If the load value is used only by N, replace it via CombineTo N.
> +        if (SDValue(LN0, 0).hasOneUse())
> +          DAG.ReplaceAllUsesOfValueWith(SDValue(LN0, 1), ExtLoad.getValue(1));
> +        else
> +          CombineTo(LN0, Trunc, ExtLoad.getValue(1));
>          // If N0 has multiple uses, change other uses as well.
>          if (!N0.hasOneUse()) {
>            SDValue TruncAnd =
> @@ -7439,7 +7447,11 @@
>        SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SDLoc(N0),
>                                    N0.getValueType(), ExtLoad);
>        ExtendSetCCUses(SetCCs, Trunc, ExtLoad, SDLoc(N), ISD::ZERO_EXTEND);
> -      CombineTo(N0.getNode(), Trunc, ExtLoad.getValue(1));
> +      // If the load value is used only by N, replace it via CombineTo N.
> +      if (SDValue(LN0, 0).hasOneUse())
> +        DAG.ReplaceAllUsesOfValueWith(SDValue(LN0, 1), ExtLoad.getValue(1));
> +      else
> +        CombineTo(LN0, Trunc, ExtLoad.getValue(1));
>        return CombineTo(N, ExtLoad); // Return N so it doesn't get rechecked!
>      }
>    }
> @@ -7491,7 +7503,11 @@
>                                      SDLoc(N0.getOperand(0)),
>                                      N0.getOperand(0).getValueType(), ExtLoad);
>          ExtendSetCCUses(SetCCs, Trunc, ExtLoad, DL, ISD::ZERO_EXTEND);
> -        CombineTo(N0.getOperand(0).getNode(), Trunc, ExtLoad.getValue(1));
> +        // If the load value is used only by N, replace it via CombineTo N.
> +        if (SDValue(LN0, 0).hasOneUse())
> +          DAG.ReplaceAllUsesOfValueWith(SDValue(LN0, 1), ExtLoad.getValue(1));
> +        else
> +          CombineTo(LN0, Trunc, ExtLoad.getValue(1));
>          // If N0 has multiple uses, change other uses as well.
>          if (!N0.hasOneUse()) {
>            SDValue TruncAnd =
> @@ -7670,13 +7686,16 @@
>                                         LN0->getChain(),
>                                         LN0->getBasePtr(), N0.getValueType(),
>                                         LN0->getMemOperand());
> -      CombineTo(N, ExtLoad);
>        SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SDLoc(N0),
>                                    N0.getValueType(), ExtLoad);
> -      CombineTo(N0.getNode(), Trunc, ExtLoad.getValue(1));
>        ExtendSetCCUses(SetCCs, Trunc, ExtLoad, SDLoc(N),
>                        ISD::ANY_EXTEND);
> -      return SDValue(N, 0);   // Return N so it doesn't get rechecked!
> +      // If the load value is used only by N, replace it via CombineTo N.
> +      if (N0.hasOneUse())
> +        DAG.ReplaceAllUsesOfValueWith(SDValue(LN0, 1), ExtLoad.getValue(1));
> +      else
> +        CombineTo(LN0, Trunc, ExtLoad.getValue(1));
> +      return CombineTo(N, ExtLoad); // Return N so it doesn't get rechecked!
>      }
>    }
>  


More information about the llvm-commits mailing list