Issue 130082
Summary [SLPVectorizer] Occasional miscompile with a switch statement
Labels new issue
Assignees
Reporter usatiuk
    Reduced reproducer:

```
; opt -S reduced.ll --passes=slp-vectorizer -slp-threshold=-99999
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-ni:1-p2:32:8:8:32-ni:2"
target triple = "x86_64-unknown-linux-gnu"

define i32 @test(i32 %0) {
entry:
 switch i32 0, label %bci_130 [
    i32 -4, label %bci_96
    i32 3, label %bci_130
    i32 1, label %bci_130
    i32 9, label %bci_108
    i32 0, label %bci_130
  ]

bci_130:                                          ; preds = %bci_96, %bci_108, %entry, %entry, %entry, %entry
  %1 = phi i32 [ 0, %bci_108 ], [ %0, %bci_96 ], [ %0, %entry ], [ %0, %entry ], [ %0, %entry ], [ %0, %entry ]
  %local_2_10 = phi i32 [ 0, %bci_108 ], [ 0, %bci_96 ], [ 0, %entry ], [ 0, %entry ], [ 0, %entry ], [ 0, %entry ]
  ret i32 0

bci_108:                                          ; preds = %entry
  br label %bci_130

bci_96:                                           ; preds = %entry
  br label %bci_130
}
```

Expected output:
```
; 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-ni:1-p2:32:8:8:32-ni:2"
target triple = "x86_64-unknown-linux-gnu"

define i32 @test(i32 %0) {
entry:
 %1 = insertelement <2 x i32> <i32 0, i32 poison>, i32 %0, i32 1
  switch i32 0, label %bci_130 [
    i32 -4, label %bci_96
    i32 3, label %bci_130
    i32 1, label %bci_130
    i32 9, label %bci_108
    i32 0, label %bci_130
  ]

bci_130:                                          ; preds = %bci_96, %bci_108, %entry, %entry, %entry, %entry
  %2 = phi <2 x i32> [ zeroinitializer, %bci_108 ], [ %1, %bci_96 ], [ %1, %entry ], [ %1, %entry ], [ %1, %entry ], [ %1, %entry ]
  ret i32 0

bci_108: ; preds = %entry
  br label %bci_130

bci_96: ; preds = %entry
  br label %bci_130
}
```

But sometimes the result is:
```
; 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-ni:1-p2:32:8:8:32-ni:2"
target triple = "x86_64-unknown-linux-gnu"

define i32 @test(i32 %0) {
entry:
 %1 = insertelement <2 x i32> <i32 0, i32 poison>, i32 %0, i32 1
  switch i32 0, label %bci_130 [
    i32 -4, label %bci_96
    i32 3, label %bci_130
    i32 1, label %bci_130
    i32 9, label %bci_108
    i32 0, label %bci_130
  ]

bci_130:                                          ; preds = %bci_96, %bci_108, %entry, %entry, %entry, %entry
  %2 = phi <2 x i32> [ zeroinitializer, %bci_108 ], [ %3, %bci_96 ], [ %1, %entry ], [ %1, %entry ], [ %1, %entry ], [ %1, %entry ]
  ret i32 0

bci_108: ; preds = %entry
  br label %bci_130

bci_96: ; preds = %entry
  %3 = load <2 x i32>, ptr poison, align 8
  br label %bci_130
}
```

I have bisected the issue to commit https://github.com/llvm/llvm-project/commit/894935cb5146fd2ac6334cc8b11e6d6e0e264fe6
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to