Skip to content

"Instruction does not dominate all uses" after Complex Deinterleaving Pass #65044

@danilaml

Description

@danilaml

For the following IR:

target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-ni:1-p2:32:8:8:32-ni:2"
target triple = "aarch64-none-linux-gnu"

define void @foo() #0 {
bb:
  br label %bb173

bb173:                                            ; preds = %bb173, %bb
  %phi177 = phi <2 x i32> [ %add190, %bb173 ], [ zeroinitializer, %bb ]
  %phi178 = phi <2 x i32> [ %add187, %bb173 ], [ zeroinitializer, %bb ]
  %add185 = add <2 x i32> %phi178, <i32 1, i32 1>
  %add186 = add <2 x i32> %phi177, <i32 1, i32 1>
  %shufflevector = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
  %add187 = add <2 x i32> %add185, %shufflevector
  %shufflevector189 = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
  %add190 = add <2 x i32> %add186, %shufflevector189
  br i1 poison, label %bb193, label %bb173

bb193:                                            ; preds = %bb173
  %add194 = or <2 x i32> %add190, %add187
  store volatile i32 0, ptr null, align 4
  unreachable
}

attributes #0 = { "target-cpu"="neoverse-v1" }

Complex deinterleaving produced broken code:

identifyNode on   %add187 = add <2 x i32> %add185, %shufflevector /   %add190 = add <2 x i32> %add186, %shufflevector189
identifyNode on   %add185 = add <2 x i32> %phi178, <i32 1, i32 1> /   %add186 = add <2 x i32> %phi177, <i32 1, i32 1>
identifyNode on   %phi178 = phi <2 x i32> [ %add187, %bb173 ], [ zeroinitializer, %bb ] /   %phi177 = phi <2 x i32> [ %add190, %bb173 ], [ zeroinitializer, %bb ]
identifyNode on <2 x i32> <i32 1, i32 1> / <2 x i32> <i32 1, i32 1>
identifyNode on   %shufflevector = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer /   %shufflevector189 = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
Identified reduction starting from instructions:   %add187 = add <2 x i32> %add185, %shufflevector /   %add190 = add <2 x i32> %add186, %shufflevector189
Verifying parent property of node %bb173
Verifying parent property of node %bb
*** IR Dump After Complex Deinterleaving Pass (complex-deinterleaving) ***
define void @foo() #0 {
bb:
  %0 = call <4 x i32> @llvm.experimental.vector.interleave2.v4i32(<2 x i32> zeroinitializer, <2 x i32> zeroinitializer)
  br label %bb173

bb173:                                            ; preds = %bb173, %bb
  %1 = phi <4 x i32> [ %0, %bb ], [ %4, %bb173 ]
  %shufflevector = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
  %2 = call <4 x i32> @llvm.experimental.vector.interleave2.v4i32(<2 x i32> <i32 1, i32 1>, <2 x i32> <i32 1, i32 1>)
  %3 = add <4 x i32> %1, %2
  %4 = add <4 x i32> %3, %5
  %shufflevector189 = shufflevector <2 x i32> zeroinitializer, <2 x i32> zeroinitializer, <2 x i32> zeroinitializer
  %5 = call <4 x i32> @llvm.experimental.vector.interleave2.v4i32(<2 x i32> %shufflevector, <2 x i32> %shufflevector189)
  br i1 true, label %bb193, label %bb173

bb193:                                            ; preds = %bb173
  %6 = call { <2 x i32>, <2 x i32> } @llvm.experimental.vector.deinterleave2.v4i32(<4 x i32> %4)
  %7 = extractvalue { <2 x i32>, <2 x i32> } %6, 0
  %8 = extractvalue { <2 x i32>, <2 x i32> } %6, 1
  %add194 = or <2 x i32> %8, %7
  store volatile i32 0, ptr null, align 4
  unreachable
}
... eventually
Instruction does not dominate all uses!
  %4 = call <4 x i32> @llvm.experimental.vector.interleave2.v4i32(<2 x i32> %shufflevector, <2 x i32> %shufflevector189)
  %3 = add <4 x i32> %2, %4
in function foo
LLVM ERROR: Broken function found, compilation aborted!

Godbolt link https://godbolt.org/z/7zbbePPd6

Bisect pointed to c15557d by @igogo-x86

Metadata

Metadata

Assignees

Type

No type

Projects

Status

Done

Relationships

None yet

Development

No branches or pull requests

Issue actions