blob: 6006bf9cb262d64829bad188611a99ecc2745677 [file]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S --passes=slp-vectorizer -mtriple=s390x-ibm-linux -mcpu=z13 -slp-max-reg-size=256 -slp-vectorize-hor-store -slp-vectorize-non-power-of-2 < %s | FileCheck %s
@c = external global [1 x [10 x i32]]
@j.0 = external global i32
define void @p() {
; CHECK-LABEL: define void @p(
; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i32>, ptr getelementptr inbounds nuw (i8, ptr @c, i64 52), align 4
; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i32> [[TMP0]], i32 0
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i32> [[TMP0]], i32 2
; CHECK-NEXT: [[TMP3:%.*]] = xor <4 x i32> [[TMP0]], splat (i32 1)
; CHECK-NEXT: store <4 x i32> [[TMP3]], ptr getelementptr inbounds nuw (i8, ptr @c, i64 52), align 4
; CHECK-NEXT: [[TMP4:%.*]] = load <7 x i32>, ptr getelementptr inbounds nuw (i8, ptr @c, i64 200), align 4
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <7 x i32> [[TMP4]], i32 3
; CHECK-NEXT: [[OR_1_5_I_3:%.*]] = or i32 [[TMP1]], [[TMP5]]
; CHECK-NEXT: store i32 [[OR_1_5_I_3]], ptr @j.0, align 4
; CHECK-NEXT: [[TMP6:%.*]] = extractelement <7 x i32> [[TMP4]], i32 5
; CHECK-NEXT: [[TMP7:%.*]] = xor <7 x i32> [[TMP4]], splat (i32 1)
; CHECK-NEXT: store <7 x i32> [[TMP7]], ptr getelementptr inbounds nuw (i8, ptr @c, i64 200), align 4
; CHECK-NEXT: [[TMP8:%.*]] = load <4 x i32>, ptr getelementptr inbounds nuw (i8, ptr @c, i64 252), align 4
; CHECK-NEXT: [[TMP9:%.*]] = extractelement <4 x i32> [[TMP8]], i32 1
; CHECK-NEXT: [[TMP10:%.*]] = or i32 [[TMP9]], [[TMP2]]
; CHECK-NEXT: [[OR_1_5_I_5:%.*]] = or i32 [[TMP10]], [[TMP6]]
; CHECK-NEXT: [[TMP11:%.*]] = extractelement <4 x i32> [[TMP8]], i32 2
; CHECK-NEXT: [[OR_1_6_I_5:%.*]] = or i32 [[OR_1_5_I_5]], [[TMP11]]
; CHECK-NEXT: store i32 [[OR_1_6_I_5]], ptr @j.0, align 4
; CHECK-NEXT: [[TMP12:%.*]] = xor <4 x i32> [[TMP8]], splat (i32 1)
; CHECK-NEXT: store <4 x i32> [[TMP12]], ptr getelementptr inbounds nuw (i8, ptr @c, i64 252), align 4
; CHECK-NEXT: ret void
;
entry:
%arrayidx12.promoted.5.i = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 200), align 4
%conv14.5.i = xor i32 %arrayidx12.promoted.5.i, 1
store i32 %conv14.5.i, ptr getelementptr inbounds nuw (i8, ptr @c, i64 200), align 4
%arrayidx12.promoted.5.i.1 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 204), align 4
%conv14.5.i.1 = xor i32 %arrayidx12.promoted.5.i.1, 1
store i32 %conv14.5.i.1, ptr getelementptr inbounds nuw (i8, ptr @c, i64 204), align 4
%arrayidx12.promoted.5.i.2 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 208), align 4
%conv14.5.i.2 = xor i32 %arrayidx12.promoted.5.i.2, 1
store i32 %conv14.5.i.2, ptr getelementptr inbounds nuw (i8, ptr @c, i64 208), align 4
%arrayidx12.promoted.1.i.3 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 52), align 4
%conv14.1.i.3 = xor i32 %arrayidx12.promoted.1.i.3, 1
store i32 %conv14.1.i.3, ptr getelementptr inbounds nuw (i8, ptr @c, i64 52), align 4
%arrayidx12.promoted.5.i.3 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 212), align 4
%conv14.5.i.3 = xor i32 %arrayidx12.promoted.5.i.3, 1
store i32 %conv14.5.i.3, ptr getelementptr inbounds nuw (i8, ptr @c, i64 212), align 4
%arrayidx12.promoted.6.i.3 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 252), align 4
%conv14.6.i.3 = xor i32 %arrayidx12.promoted.6.i.3, 1
%or.1.5.i.3 = or i32 %arrayidx12.promoted.1.i.3, %arrayidx12.promoted.5.i.3
store i32 %conv14.6.i.3, ptr getelementptr inbounds nuw (i8, ptr @c, i64 252), align 4
store i32 %or.1.5.i.3, ptr @j.0, align 4
%arrayidx12.promoted.1.i.4 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 56), align 4
%conv14.1.i.4 = xor i32 %arrayidx12.promoted.1.i.4, 1
store i32 %conv14.1.i.4, ptr getelementptr inbounds nuw (i8, ptr @c, i64 56), align 4
%arrayidx12.promoted.5.i.4 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 216), align 4
%conv14.5.i.4 = xor i32 %arrayidx12.promoted.5.i.4, 1
store i32 %conv14.5.i.4, ptr getelementptr inbounds nuw (i8, ptr @c, i64 216), align 4
%arrayidx12.promoted.6.i.4 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 256), align 4
%conv14.6.i.4 = xor i32 %arrayidx12.promoted.6.i.4, 1
store i32 %conv14.6.i.4, ptr getelementptr inbounds nuw (i8, ptr @c, i64 256), align 4
%arrayidx12.promoted.1.i.5 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 60), align 4
%conv14.1.i.5 = xor i32 %arrayidx12.promoted.1.i.5, 1
store i32 %conv14.1.i.5, ptr getelementptr inbounds nuw (i8, ptr @c, i64 60), align 4
%arrayidx12.promoted.5.i.5 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 220), align 4
%conv14.5.i.5 = xor i32 %arrayidx12.promoted.5.i.5, 1
store i32 %conv14.5.i.5, ptr getelementptr inbounds nuw (i8, ptr @c, i64 220), align 4
%arrayidx12.promoted.6.i.5 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 260), align 4
%conv14.6.i.5 = xor i32 %arrayidx12.promoted.6.i.5, 1
%0 = or i32 %arrayidx12.promoted.6.i.4, %arrayidx12.promoted.1.i.5
%or.1.5.i.5 = or i32 %0, %arrayidx12.promoted.5.i.5
%or.1.6.i.5 = or i32 %or.1.5.i.5, %arrayidx12.promoted.6.i.5
store i32 %conv14.6.i.5, ptr getelementptr inbounds nuw (i8, ptr @c, i64 260), align 4
store i32 %or.1.6.i.5, ptr @j.0, align 4
%arrayidx12.promoted.1.i.6 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 64), align 4
%conv14.1.i.6 = xor i32 %arrayidx12.promoted.1.i.6, 1
store i32 %conv14.1.i.6, ptr getelementptr inbounds nuw (i8, ptr @c, i64 64), align 4
%arrayidx12.promoted.5.i.6 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 224), align 4
%conv14.5.i.6 = xor i32 %arrayidx12.promoted.5.i.6, 1
store i32 %conv14.5.i.6, ptr getelementptr inbounds nuw (i8, ptr @c, i64 224), align 4
%arrayidx12.promoted.6.i.6 = load i32, ptr getelementptr inbounds nuw (i8, ptr @c, i64 264), align 4
%conv14.6.i.6 = xor i32 %arrayidx12.promoted.6.i.6, 1
store i32 %conv14.6.i.6, ptr getelementptr inbounds nuw (i8, ptr @c, i64 264), align 4
ret void
}