Issue 175967
Summary [SLPVectorizer] Crash after 1a8f5fa823a55bce9be368097d2ac7e137fe5d17
Labels new issue
Assignees alexey-bataev
Reporter boomanaiden154
    Looking at the following IR:
```
; ModuleID = './reduced.ll'
source_filename = "./reduced.ll"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-grtev4-linux-gnu"

define fastcc void @wombat(i32 %arg) #0 {
bb:
  %zext = zext i32 %arg to i64
  %sext = sext i32 0 to i64
 %select = select i1 false, i32 0, i32 0
  %zext1 = zext i32 %select to i64
 %mul = mul i64 0, %zext1
  %or = or i64 0, %mul
  %or2 = or i64 %or, 0
 %zext3 = zext i32 0 to i64
  %mul4 = mul i64 0, %zext3
  %or5 = or i64 %or2, %mul4
  %lshr = lshr i64 %or5, 0
  %trunc = trunc i64 %lshr to i32
 %call = tail call i32 @llvm.smax.i32(i32 %trunc, i32 0)
  %call6 = tail call i32 @llvm.smin.i32(i32 %call, i32 0)
  %trunc7 = trunc i32 %call6 to i16
 %getelementptr = getelementptr i8, ptr poison, i64 16
  store i16 %trunc7, ptr %getelementptr, align 2
  %mul8 = mul i64 0, %zext
  %or9 = or i64 0, %mul8
  %or10 = or i64 %or9, 0
  %sext11 = sext i32 0 to i64
  %mul12 = mul i64 0, %sext11
  %or13 = or i64 %or10, %mul12
  %lshr14 = lshr i64 %or13, 0
  %trunc15 = trunc i64 %lshr14 to i32
  %call16 = tail call i32 @llvm.smax.i32(i32 %trunc15, i32 0)
  %call17 = tail call i32 @llvm.smin.i32(i32 %call16, i32 0)
  %trunc18 = trunc i32 %call17 to i16
 %getelementptr19 = getelementptr i8, ptr poison, i64 18
  store i16 %trunc18, ptr %getelementptr19, align 2
  %sext20 = sext i32 0 to i64
 %mul21 = mul i64 0, %sext20
  %or22 = or i64 %zext3, %mul21
  %or23 = or i64 %or22, 0
  %mul24 = mul i64 0, %zext1
  %or25 = or i64 %or23, %mul24
 %lshr26 = lshr i64 %or25, 0
  %trunc27 = trunc i64 %lshr26 to i32
  %call28 = tail call i32 @llvm.smax.i32(i32 %trunc27, i32 0)
  %call29 = tail call i32 @llvm.smin.i32(i32 %call28, i32 0)
  %trunc30 = trunc i32 %call29 to i16
  %getelementptr31 = getelementptr i8, ptr poison, i64 20
  store i16 %trunc30, ptr %getelementptr31, align 2
  %sext32 = sext i32 0 to i64
 %mul33 = mul i64 0, %sext32
  %or34 = or i64 0, %mul33
  %or35 = or i64 %or34, 0
  %mul36 = mul i64 0, %sext
  %or37 = or i64 %or35, %mul36
 %lshr38 = lshr i64 %or37, 0
  %trunc39 = trunc i64 %lshr38 to i32
  %call40 = tail call i32 @llvm.smax.i32(i32 %trunc39, i32 0)
  %call41 = tail call i32 @llvm.smin.i32(i32 %call40, i32 0)
  %trunc42 = trunc i32 %call41 to i16
  %getelementptr43 = getelementptr i8, ptr poison, i64 22
  store i16 %trunc42, ptr %getelementptr43, align 2
  %mul44 = mul i64 0, %zext1
 %or45 = or i64 0, %mul44
  %or46 = or i64 %or45, 0
  %mul47 = mul i64 0, %zext3
  %or48 = or i64 %or46, %mul47
  %lshr49 = lshr i64 %or48, 0
 %trunc50 = trunc i64 %lshr49 to i32
  %call51 = tail call i32 @llvm.smax.i32(i32 %trunc50, i32 0)
  %call52 = tail call i32 @llvm.smin.i32(i32 %call51, i32 0)
  %trunc53 = trunc i32 %call52 to i16
 %getelementptr54 = getelementptr i8, ptr poison, i64 24
  store i16 %trunc53, ptr %getelementptr54, align 2
  %mul55 = mul i64 0, %zext
  %or56 = or i64 0, %mul55
  %or57 = or i64 %or56, 0
  %mul58 = mul i64 0, %sext11
  %or59 = or i64 %or57, %mul58
  %lshr60 = lshr i64 %or59, 0
 %trunc61 = trunc i64 %lshr60 to i32
  %call62 = tail call i32 @llvm.smax.i32(i32 %trunc61, i32 0)
  %call63 = tail call i32 @llvm.smin.i32(i32 %call62, i32 0)
  %trunc64 = trunc i32 %call63 to i16
 %getelementptr65 = getelementptr i8, ptr poison, i64 26
  store i16 %trunc64, ptr %getelementptr65, align 2
  %mul66 = mul i64 0, %sext20
 %or67 = or i64 0, %mul66
  %or68 = or i64 %or67, 0
  %mul69 = mul i64 0, %zext1
  %or70 = or i64 %or68, %mul69
  %lshr71 = lshr i64 %or70, 0
 %trunc72 = trunc i64 %lshr71 to i32
  %call73 = tail call i32 @llvm.smax.i32(i32 %trunc72, i32 0)
  %call74 = tail call i32 @llvm.smin.i32(i32 %call73, i32 0)
  %trunc75 = trunc i32 %call74 to i16
 %getelementptr76 = getelementptr i8, ptr poison, i64 28
  store i16 %trunc75, ptr %getelementptr76, align 2
  %mul77 = mul i64 0, %sext32
 %or78 = or i64 0, %mul77
  %or79 = or i64 %or78, 0
  %mul80 = mul i64 0, %sext
  %or81 = or i64 %or79, %mul80
  %lshr82 = lshr i64 %or81, 0
 %trunc83 = trunc i64 %lshr82 to i32
  %call84 = tail call i32 @llvm.smax.i32(i32 %trunc83, i32 0)
  %call85 = tail call i32 @llvm.smin.i32(i32 %call84, i32 0)
  %trunc86 = trunc i32 %call85 to i16
 %getelementptr87 = getelementptr i8, ptr poison, i64 30
  store i16 %trunc86, ptr %getelementptr87, align 2
  ret void
}

; Function Attrs: nocallback nocreateundeforpoison nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smin.i32(i32, i32) #1

; Function Attrs: nocallback nocreateundeforpoison nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smax.i32(i32, i32) #1

attributes #0 = { "target-cpu"="haswell" }
attributes #1 = { nocallback nocreateundeforpoison nofree nosync nounwind speculatable willreturn memory(none) }
```

and running `opt`:
```
./bin/opt -passes="slp-vectorizer,verify" ./reduced.ll -disable-output
```

we're seeing the following error after the commit in the title:
```
Instruction does not dominate all uses!
  %6 = zext <2 x i32> %5 to <2 x i64>
  %0 = shufflevector <2 x i64> %6, <2 x i64> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
LLVM ERROR: Broken function found, compilation aborted!
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to