aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/Transforms/VectorCombine/binop-scalarize.ll
blob: bc07f8b0864968c4d5597d6c8a379cd3cd583365 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt < %s -S -p vector-combine | FileCheck %s

; FIXME: The way we scalarize this today is by creating a
;
; %v = udiv <4 x i8> splat (i8 1), <i8 0, i8 1, i8 1, i8 1>
;
; to insert the scalar into, which is immediate UB.  Coincidentally, at creation
; this gets constant folded into <i8 poison, i8 1, i8 1, i8 1>, but we shouldn't
; rely on this.
define <4 x i8> @udiv_ub(i8 %x, i8 %y) {
; CHECK-LABEL: define <4 x i8> @udiv_ub(
; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {
; CHECK-NEXT:    [[V_SCALAR:%.*]] = udiv i8 [[X]], [[Y]]
; CHECK-NEXT:    [[V:%.*]] = insertelement <4 x i8> <i8 poison, i8 1, i8 1, i8 1>, i8 [[V_SCALAR]], i64 0
; CHECK-NEXT:    ret <4 x i8> [[V]]
;
  %x.insert = insertelement <4 x i8> splat (i8 1), i8 %x, i32 0
  %y.insert = insertelement <4 x i8> <i8 0, i8 1, i8 1, i8 1>, i8 %y, i32 0
  %v = udiv <4 x i8> %x.insert, %y.insert
  ret <4 x i8> %v
}


; Unfoldable constant expression may cause infinite loop between 
; scalarizing insertelement and folding binop(insert(x,a,idx),insert(y,b,idx))
@val = external hidden global ptr, align 8

define <2 x i64> @pr153012(i64 %idx) #0 {
; CHECK-LABEL: define <2 x i64> @pr153012(
; CHECK-SAME: i64 [[IDX:%.*]]) {
; CHECK-NEXT:  [[ENTRY:.*:]]
; CHECK-NEXT:    [[A:%.*]] = insertelement <2 x i64> <i64 5, i64 ptrtoint (ptr @val to i64)>, i64 [[IDX]], i32 0
; CHECK-NEXT:    [[B:%.*]] = or disjoint <2 x i64> splat (i64 2), [[A]]
; CHECK-NEXT:    ret <2 x i64> [[B]]
;
entry:
  %a = insertelement <2 x i64> <i64 5, i64 ptrtoint (ptr @val to i64)>, i64 %idx, i32 0
  %b = or disjoint <2 x i64> splat (i64 2), %a
  ret <2 x i64> %b
}