blob: 1a4cbb16b9a915b304a262f8208b762602f76c77 [file] [log] [blame]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -slp-vectorizer -S -o - -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 -slp-threshold=50 -slp-recursion-max-depth=6 < %s | FileCheck %s
define i32 @bar() local_unnamed_addr {
; CHECK-LABEL: @bar(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[ADD103:%.*]] = add nsw i32 undef, undef
; CHECK-NEXT: [[SUB104:%.*]] = sub nsw i32 undef, undef
; CHECK-NEXT: [[ADD105:%.*]] = add nsw i32 undef, undef
; CHECK-NEXT: [[SUB106:%.*]] = sub nsw i32 undef, undef
; CHECK-NEXT: [[SHR_I:%.*]] = lshr i32 [[ADD103]], 15
; CHECK-NEXT: [[AND_I:%.*]] = and i32 [[SHR_I]], 65537
; CHECK-NEXT: [[MUL_I:%.*]] = mul nuw i32 [[AND_I]], 65535
; CHECK-NEXT: [[ADD_I:%.*]] = add i32 [[MUL_I]], [[ADD103]]
; CHECK-NEXT: [[XOR_I:%.*]] = xor i32 [[ADD_I]], [[MUL_I]]
; CHECK-NEXT: [[SHR_I64:%.*]] = lshr i32 [[ADD105]], 15
; CHECK-NEXT: [[AND_I65:%.*]] = and i32 [[SHR_I64]], 65537
; CHECK-NEXT: [[MUL_I66:%.*]] = mul nuw i32 [[AND_I65]], 65535
; CHECK-NEXT: [[ADD_I67:%.*]] = add i32 [[MUL_I66]], [[ADD105]]
; CHECK-NEXT: [[XOR_I68:%.*]] = xor i32 [[ADD_I67]], [[MUL_I66]]
; CHECK-NEXT: [[SHR_I69:%.*]] = lshr i32 [[SUB104]], 15
; CHECK-NEXT: [[AND_I70:%.*]] = and i32 [[SHR_I69]], 65537
; CHECK-NEXT: [[MUL_I71:%.*]] = mul nuw i32 [[AND_I70]], 65535
; CHECK-NEXT: [[ADD_I72:%.*]] = add i32 [[MUL_I71]], [[SUB104]]
; CHECK-NEXT: [[XOR_I73:%.*]] = xor i32 [[ADD_I72]], [[MUL_I71]]
; CHECK-NEXT: [[SHR_I74:%.*]] = lshr i32 [[SUB106]], 15
; CHECK-NEXT: [[AND_I75:%.*]] = and i32 [[SHR_I74]], 65537
; CHECK-NEXT: [[MUL_I76:%.*]] = mul nuw i32 [[AND_I75]], 65535
; CHECK-NEXT: [[ADD_I77:%.*]] = add i32 [[MUL_I76]], [[SUB106]]
; CHECK-NEXT: [[XOR_I78:%.*]] = xor i32 [[ADD_I77]], [[MUL_I76]]
; CHECK-NEXT: [[ADD110:%.*]] = add i32 [[XOR_I68]], [[XOR_I]]
; CHECK-NEXT: [[ADD112:%.*]] = add i32 [[ADD110]], [[XOR_I73]]
; CHECK-NEXT: [[ADD113:%.*]] = add i32 [[ADD112]], [[XOR_I78]]
; CHECK-NEXT: [[ADD78_1:%.*]] = add nsw i32 undef, undef
; CHECK-NEXT: [[SUB86_1:%.*]] = sub nsw i32 undef, undef
; CHECK-NEXT: [[ADD94_1:%.*]] = add nsw i32 undef, undef
; CHECK-NEXT: [[SUB102_1:%.*]] = sub nsw i32 undef, undef
; CHECK-NEXT: [[ADD103_1:%.*]] = add nsw i32 [[ADD94_1]], [[ADD78_1]]
; CHECK-NEXT: [[SUB104_1:%.*]] = sub nsw i32 [[ADD78_1]], [[ADD94_1]]
; CHECK-NEXT: [[ADD105_1:%.*]] = add nsw i32 [[SUB102_1]], [[SUB86_1]]
; CHECK-NEXT: [[SUB106_1:%.*]] = sub nsw i32 [[SUB86_1]], [[SUB102_1]]
; CHECK-NEXT: [[SHR_I_1:%.*]] = lshr i32 [[ADD103_1]], 15
; CHECK-NEXT: [[AND_I_1:%.*]] = and i32 [[SHR_I_1]], 65537
; CHECK-NEXT: [[MUL_I_1:%.*]] = mul nuw i32 [[AND_I_1]], 65535
; CHECK-NEXT: [[ADD_I_1:%.*]] = add i32 [[MUL_I_1]], [[ADD103_1]]
; CHECK-NEXT: [[XOR_I_1:%.*]] = xor i32 [[ADD_I_1]], [[MUL_I_1]]
; CHECK-NEXT: [[SHR_I64_1:%.*]] = lshr i32 [[ADD105_1]], 15
; CHECK-NEXT: [[AND_I65_1:%.*]] = and i32 [[SHR_I64_1]], 65537
; CHECK-NEXT: [[MUL_I66_1:%.*]] = mul nuw i32 [[AND_I65_1]], 65535
; CHECK-NEXT: [[ADD_I67_1:%.*]] = add i32 [[MUL_I66_1]], [[ADD105_1]]
; CHECK-NEXT: [[XOR_I68_1:%.*]] = xor i32 [[ADD_I67_1]], [[MUL_I66_1]]
; CHECK-NEXT: [[SHR_I69_1:%.*]] = lshr i32 [[SUB104_1]], 15
; CHECK-NEXT: [[AND_I70_1:%.*]] = and i32 [[SHR_I69_1]], 65537
; CHECK-NEXT: [[MUL_I71_1:%.*]] = mul nuw i32 [[AND_I70_1]], 65535
; CHECK-NEXT: [[ADD_I72_1:%.*]] = add i32 [[MUL_I71_1]], [[SUB104_1]]
; CHECK-NEXT: [[XOR_I73_1:%.*]] = xor i32 [[ADD_I72_1]], [[MUL_I71_1]]
; CHECK-NEXT: [[SHR_I74_1:%.*]] = lshr i32 [[SUB106_1]], 15
; CHECK-NEXT: [[AND_I75_1:%.*]] = and i32 [[SHR_I74_1]], 65537
; CHECK-NEXT: [[MUL_I76_1:%.*]] = mul nuw i32 [[AND_I75_1]], 65535
; CHECK-NEXT: [[ADD_I77_1:%.*]] = add i32 [[MUL_I76_1]], [[SUB106_1]]
; CHECK-NEXT: [[XOR_I78_1:%.*]] = xor i32 [[ADD_I77_1]], [[MUL_I76_1]]
; CHECK-NEXT: [[ADD108_1:%.*]] = add i32 [[XOR_I68_1]], [[ADD113]]
; CHECK-NEXT: [[ADD110_1:%.*]] = add i32 [[ADD108_1]], [[XOR_I_1]]
; CHECK-NEXT: [[ADD112_1:%.*]] = add i32 [[ADD110_1]], [[XOR_I73_1]]
; CHECK-NEXT: [[ADD113_1:%.*]] = add i32 [[ADD112_1]], [[XOR_I78_1]]
; CHECK-NEXT: [[ADD78_2:%.*]] = add nsw i32 undef, undef
; CHECK-NEXT: [[ADD103_2:%.*]] = add nsw i32 undef, [[ADD78_2]]
; CHECK-NEXT: [[SUB104_2:%.*]] = sub nsw i32 [[ADD78_2]], undef
; CHECK-NEXT: [[ADD105_2:%.*]] = add nsw i32 undef, undef
; CHECK-NEXT: [[SUB106_2:%.*]] = sub nsw i32 undef, undef
; CHECK-NEXT: [[SHR_I_2:%.*]] = lshr i32 [[ADD103_2]], 15
; CHECK-NEXT: [[AND_I_2:%.*]] = and i32 [[SHR_I_2]], 65537
; CHECK-NEXT: [[MUL_I_2:%.*]] = mul nuw i32 [[AND_I_2]], 65535
; CHECK-NEXT: [[ADD_I_2:%.*]] = add i32 [[MUL_I_2]], [[ADD103_2]]
; CHECK-NEXT: [[XOR_I_2:%.*]] = xor i32 [[ADD_I_2]], [[MUL_I_2]]
; CHECK-NEXT: [[SHR_I64_2:%.*]] = lshr i32 [[ADD105_2]], 15
; CHECK-NEXT: [[AND_I65_2:%.*]] = and i32 [[SHR_I64_2]], 65537
; CHECK-NEXT: [[MUL_I66_2:%.*]] = mul nuw i32 [[AND_I65_2]], 65535
; CHECK-NEXT: [[ADD_I67_2:%.*]] = add i32 [[MUL_I66_2]], [[ADD105_2]]
; CHECK-NEXT: [[XOR_I68_2:%.*]] = xor i32 [[ADD_I67_2]], [[MUL_I66_2]]
; CHECK-NEXT: [[SHR_I69_2:%.*]] = lshr i32 [[SUB104_2]], 15
; CHECK-NEXT: [[AND_I70_2:%.*]] = and i32 [[SHR_I69_2]], 65537
; CHECK-NEXT: [[MUL_I71_2:%.*]] = mul nuw i32 [[AND_I70_2]], 65535
; CHECK-NEXT: [[ADD_I72_2:%.*]] = add i32 [[MUL_I71_2]], [[SUB104_2]]
; CHECK-NEXT: [[XOR_I73_2:%.*]] = xor i32 [[ADD_I72_2]], [[MUL_I71_2]]
; CHECK-NEXT: [[SHR_I74_2:%.*]] = lshr i32 [[SUB106_2]], 15
; CHECK-NEXT: [[AND_I75_2:%.*]] = and i32 [[SHR_I74_2]], 65537
; CHECK-NEXT: [[MUL_I76_2:%.*]] = mul nuw i32 [[AND_I75_2]], 65535
; CHECK-NEXT: [[ADD_I77_2:%.*]] = add i32 [[MUL_I76_2]], [[SUB106_2]]
; CHECK-NEXT: [[XOR_I78_2:%.*]] = xor i32 [[ADD_I77_2]], [[MUL_I76_2]]
; CHECK-NEXT: [[ADD108_2:%.*]] = add i32 [[XOR_I68_2]], [[ADD113_1]]
; CHECK-NEXT: [[ADD110_2:%.*]] = add i32 [[ADD108_2]], [[XOR_I_2]]
; CHECK-NEXT: [[ADD112_2:%.*]] = add i32 [[ADD110_2]], [[XOR_I73_2]]
; CHECK-NEXT: [[ADD113_2:%.*]] = add i32 [[ADD112_2]], [[XOR_I78_2]]
; CHECK-NEXT: [[SUB102_3:%.*]] = sub nsw i32 undef, undef
; CHECK-NEXT: [[ADD103_3:%.*]] = add nsw i32 undef, undef
; CHECK-NEXT: [[SUB104_3:%.*]] = sub nsw i32 undef, undef
; CHECK-NEXT: [[ADD105_3:%.*]] = add nsw i32 [[SUB102_3]], undef
; CHECK-NEXT: [[SUB106_3:%.*]] = sub nsw i32 undef, [[SUB102_3]]
; CHECK-NEXT: [[SHR_I_3:%.*]] = lshr i32 [[ADD103_3]], 15
; CHECK-NEXT: [[AND_I_3:%.*]] = and i32 [[SHR_I_3]], 65537
; CHECK-NEXT: [[MUL_I_3:%.*]] = mul nuw i32 [[AND_I_3]], 65535
; CHECK-NEXT: [[ADD_I_3:%.*]] = add i32 [[MUL_I_3]], [[ADD103_3]]
; CHECK-NEXT: [[XOR_I_3:%.*]] = xor i32 [[ADD_I_3]], [[MUL_I_3]]
; CHECK-NEXT: [[SHR_I64_3:%.*]] = lshr i32 [[ADD105_3]], 15
; CHECK-NEXT: [[AND_I65_3:%.*]] = and i32 [[SHR_I64_3]], 65537
; CHECK-NEXT: [[MUL_I66_3:%.*]] = mul nuw i32 [[AND_I65_3]], 65535
; CHECK-NEXT: [[ADD_I67_3:%.*]] = add i32 [[MUL_I66_3]], [[ADD105_3]]
; CHECK-NEXT: [[XOR_I68_3:%.*]] = xor i32 [[ADD_I67_3]], [[MUL_I66_3]]
; CHECK-NEXT: [[SHR_I69_3:%.*]] = lshr i32 [[SUB104_3]], 15
; CHECK-NEXT: [[AND_I70_3:%.*]] = and i32 [[SHR_I69_3]], 65537
; CHECK-NEXT: [[MUL_I71_3:%.*]] = mul nuw i32 [[AND_I70_3]], 65535
; CHECK-NEXT: [[ADD_I72_3:%.*]] = add i32 [[MUL_I71_3]], [[SUB104_3]]
; CHECK-NEXT: [[XOR_I73_3:%.*]] = xor i32 [[ADD_I72_3]], [[MUL_I71_3]]
; CHECK-NEXT: [[SHR_I74_3:%.*]] = lshr i32 [[SUB106_3]], 15
; CHECK-NEXT: [[AND_I75_3:%.*]] = and i32 [[SHR_I74_3]], 65537
; CHECK-NEXT: [[MUL_I76_3:%.*]] = mul nuw i32 [[AND_I75_3]], 65535
; CHECK-NEXT: [[ADD_I77_3:%.*]] = add i32 [[MUL_I76_3]], [[SUB106_3]]
; CHECK-NEXT: [[XOR_I78_3:%.*]] = xor i32 [[ADD_I77_3]], [[MUL_I76_3]]
; CHECK-NEXT: [[ADD108_3:%.*]] = add i32 [[XOR_I68_3]], [[ADD113_2]]
; CHECK-NEXT: [[ADD110_3:%.*]] = add i32 [[ADD108_3]], [[XOR_I_3]]
; CHECK-NEXT: [[ADD112_3:%.*]] = add i32 [[ADD110_3]], [[XOR_I73_3]]
; CHECK-NEXT: [[ADD113_3:%.*]] = add i32 [[ADD112_3]], [[XOR_I78_3]]
; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[ADD113_3]], 16
; CHECK-NEXT: [[ADD119:%.*]] = add nuw nsw i32 undef, [[SHR]]
; CHECK-NEXT: [[SHR120:%.*]] = lshr i32 [[ADD119]], 1
; CHECK-NEXT: ret i32 [[SHR120]]
;
entry:
%add103 = add nsw i32 undef, undef
%sub104 = sub nsw i32 undef, undef
%add105 = add nsw i32 undef, undef
%sub106 = sub nsw i32 undef, undef
%shr.i = lshr i32 %add103, 15
%and.i = and i32 %shr.i, 65537
%mul.i = mul nuw i32 %and.i, 65535
%add.i = add i32 %mul.i, %add103
%xor.i = xor i32 %add.i, %mul.i
%shr.i64 = lshr i32 %add105, 15
%and.i65 = and i32 %shr.i64, 65537
%mul.i66 = mul nuw i32 %and.i65, 65535
%add.i67 = add i32 %mul.i66, %add105
%xor.i68 = xor i32 %add.i67, %mul.i66
%shr.i69 = lshr i32 %sub104, 15
%and.i70 = and i32 %shr.i69, 65537
%mul.i71 = mul nuw i32 %and.i70, 65535
%add.i72 = add i32 %mul.i71, %sub104
%xor.i73 = xor i32 %add.i72, %mul.i71
%shr.i74 = lshr i32 %sub106, 15
%and.i75 = and i32 %shr.i74, 65537
%mul.i76 = mul nuw i32 %and.i75, 65535
%add.i77 = add i32 %mul.i76, %sub106
%xor.i78 = xor i32 %add.i77, %mul.i76
%add110 = add i32 %xor.i68, %xor.i
%add112 = add i32 %add110, %xor.i73
%add113 = add i32 %add112, %xor.i78
%add78.1 = add nsw i32 undef, undef
%sub86.1 = sub nsw i32 undef, undef
%add94.1 = add nsw i32 undef, undef
%sub102.1 = sub nsw i32 undef, undef
%add103.1 = add nsw i32 %add94.1, %add78.1
%sub104.1 = sub nsw i32 %add78.1, %add94.1
%add105.1 = add nsw i32 %sub102.1, %sub86.1
%sub106.1 = sub nsw i32 %sub86.1, %sub102.1
%shr.i.1 = lshr i32 %add103.1, 15
%and.i.1 = and i32 %shr.i.1, 65537
%mul.i.1 = mul nuw i32 %and.i.1, 65535
%add.i.1 = add i32 %mul.i.1, %add103.1
%xor.i.1 = xor i32 %add.i.1, %mul.i.1
%shr.i64.1 = lshr i32 %add105.1, 15
%and.i65.1 = and i32 %shr.i64.1, 65537
%mul.i66.1 = mul nuw i32 %and.i65.1, 65535
%add.i67.1 = add i32 %mul.i66.1, %add105.1
%xor.i68.1 = xor i32 %add.i67.1, %mul.i66.1
%shr.i69.1 = lshr i32 %sub104.1, 15
%and.i70.1 = and i32 %shr.i69.1, 65537
%mul.i71.1 = mul nuw i32 %and.i70.1, 65535
%add.i72.1 = add i32 %mul.i71.1, %sub104.1
%xor.i73.1 = xor i32 %add.i72.1, %mul.i71.1
%shr.i74.1 = lshr i32 %sub106.1, 15
%and.i75.1 = and i32 %shr.i74.1, 65537
%mul.i76.1 = mul nuw i32 %and.i75.1, 65535
%add.i77.1 = add i32 %mul.i76.1, %sub106.1
%xor.i78.1 = xor i32 %add.i77.1, %mul.i76.1
%add108.1 = add i32 %xor.i68.1, %add113
%add110.1 = add i32 %add108.1, %xor.i.1
%add112.1 = add i32 %add110.1, %xor.i73.1
%add113.1 = add i32 %add112.1, %xor.i78.1
%add78.2 = add nsw i32 undef, undef
%add103.2 = add nsw i32 undef, %add78.2
%sub104.2 = sub nsw i32 %add78.2, undef
%add105.2 = add nsw i32 undef, undef
%sub106.2 = sub nsw i32 undef, undef
%shr.i.2 = lshr i32 %add103.2, 15
%and.i.2 = and i32 %shr.i.2, 65537
%mul.i.2 = mul nuw i32 %and.i.2, 65535
%add.i.2 = add i32 %mul.i.2, %add103.2
%xor.i.2 = xor i32 %add.i.2, %mul.i.2
%shr.i64.2 = lshr i32 %add105.2, 15
%and.i65.2 = and i32 %shr.i64.2, 65537
%mul.i66.2 = mul nuw i32 %and.i65.2, 65535
%add.i67.2 = add i32 %mul.i66.2, %add105.2
%xor.i68.2 = xor i32 %add.i67.2, %mul.i66.2
%shr.i69.2 = lshr i32 %sub104.2, 15
%and.i70.2 = and i32 %shr.i69.2, 65537
%mul.i71.2 = mul nuw i32 %and.i70.2, 65535
%add.i72.2 = add i32 %mul.i71.2, %sub104.2
%xor.i73.2 = xor i32 %add.i72.2, %mul.i71.2
%shr.i74.2 = lshr i32 %sub106.2, 15
%and.i75.2 = and i32 %shr.i74.2, 65537
%mul.i76.2 = mul nuw i32 %and.i75.2, 65535
%add.i77.2 = add i32 %mul.i76.2, %sub106.2
%xor.i78.2 = xor i32 %add.i77.2, %mul.i76.2
%add108.2 = add i32 %xor.i68.2, %add113.1
%add110.2 = add i32 %add108.2, %xor.i.2
%add112.2 = add i32 %add110.2, %xor.i73.2
%add113.2 = add i32 %add112.2, %xor.i78.2
%sub102.3 = sub nsw i32 undef, undef
%add103.3 = add nsw i32 undef, undef
%sub104.3 = sub nsw i32 undef, undef
%add105.3 = add nsw i32 %sub102.3, undef
%sub106.3 = sub nsw i32 undef, %sub102.3
%shr.i.3 = lshr i32 %add103.3, 15
%and.i.3 = and i32 %shr.i.3, 65537
%mul.i.3 = mul nuw i32 %and.i.3, 65535
%add.i.3 = add i32 %mul.i.3, %add103.3
%xor.i.3 = xor i32 %add.i.3, %mul.i.3
%shr.i64.3 = lshr i32 %add105.3, 15
%and.i65.3 = and i32 %shr.i64.3, 65537
%mul.i66.3 = mul nuw i32 %and.i65.3, 65535
%add.i67.3 = add i32 %mul.i66.3, %add105.3
%xor.i68.3 = xor i32 %add.i67.3, %mul.i66.3
%shr.i69.3 = lshr i32 %sub104.3, 15
%and.i70.3 = and i32 %shr.i69.3, 65537
%mul.i71.3 = mul nuw i32 %and.i70.3, 65535
%add.i72.3 = add i32 %mul.i71.3, %sub104.3
%xor.i73.3 = xor i32 %add.i72.3, %mul.i71.3
%shr.i74.3 = lshr i32 %sub106.3, 15
%and.i75.3 = and i32 %shr.i74.3, 65537
%mul.i76.3 = mul nuw i32 %and.i75.3, 65535
%add.i77.3 = add i32 %mul.i76.3, %sub106.3
%xor.i78.3 = xor i32 %add.i77.3, %mul.i76.3
%add108.3 = add i32 %xor.i68.3, %add113.2
%add110.3 = add i32 %add108.3, %xor.i.3
%add112.3 = add i32 %add110.3, %xor.i73.3
%add113.3 = add i32 %add112.3, %xor.i78.3
%shr = lshr i32 %add113.3, 16
%add119 = add nuw nsw i32 undef, %shr
%shr120 = lshr i32 %add119, 1
ret i32 %shr120
}