rs6000: Make code questionably using r2 not ICE (PR94420)
authorSegher Boessenkool <segher@kernel.crashing.org>
Wed, 1 Apr 2020 16:51:04 +0000 (16:51 +0000)
committerSegher Boessenkool <segher@kernel.crashing.org>
Wed, 1 Apr 2020 17:00:10 +0000 (17:00 +0000)
The example code in the PR uses r2 (the TOC register) directly.  In the
RTL generated for that, r2 is copied to some pseudo, and then cprop
propagates that into a "*tocref<mode>" insn, because nothing is
preventing it from doing that.

So, put the same condition in the insn condition for this as we will
later encounter in the constraint anyway, fixing this.

2020-04-01  Segher Boessenkool  <segher@kernel.crashing.org>

PR target/94420
* config/rs6000/rs6000.md (*tocref<mode> for P): Add insn condition
on operands[1].

gcc/config/rs6000/rs6000.md

index dcccb03f376ee7a24446b281106c8107c42b0074..11ab74589b494dcb81f561d281dff3f39aaa7506 100644 (file)
 (define_insn_and_split "*tocref<mode>"
   [(set (match_operand:P 0 "gpc_reg_operand" "=b")
        (match_operand:P 1 "small_toc_ref" "R"))]
-   "TARGET_TOC"
+   "TARGET_TOC
+    && legitimate_constant_pool_address_p (operands[1], QImode, false)"
    "la %0,%a1"
    "&& TARGET_CMODEL != CMODEL_SMALL && reload_completed"
   [(set (match_dup 0) (high:P (match_dup 1)))