| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s |
| |
| define i32 @test(i32 %xor4.i, i32 %xor18.i, i1 %tobool.not.i) { |
| ; CHECK-LABEL: define i32 @test( |
| ; CHECK-SAME: i32 [[XOR4_I:%.*]], i32 [[XOR18_I:%.*]], i1 [[TOBOOL_NOT_I:%.*]]) { |
| ; CHECK-NEXT: [[ENTRY:.*]]: |
| ; CHECK-NEXT: br label %[[BB:.*]] |
| ; CHECK: [[BB]]: |
| ; CHECK-NEXT: [[XOR375678_I:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[XOR37_I:%.*]], %[[BB]] ] |
| ; CHECK-NEXT: [[XOR385777_I:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[XOR35_I:%.*]], %[[BB]] ] |
| ; CHECK-NEXT: [[XOR445876_I:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[AND43_I:%.*]], %[[BB]] ] |
| ; CHECK-NEXT: [[XOR505975_I:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[XOR48_I:%.*]], %[[BB]] ] |
| ; CHECK-NEXT: [[XOR316272_I:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[XOR31_I:%.*]], %[[BB]] ] |
| ; CHECK-NEXT: [[XOR536470_I:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[XOR53_I:%.*]], %[[BB]] ] |
| ; CHECK-NEXT: [[XOR30_I:%.*]] = tail call i32 @llvm.fshl.i32(i32 [[XOR4_I]], i32 1, i32 1) |
| ; CHECK-NEXT: [[XOR31_I]] = xor i32 [[XOR30_I]], [[XOR4_I]] |
| ; CHECK-NEXT: [[XOR11_I:%.*]] = tail call i32 @llvm.fshl.i32(i32 [[XOR4_I]], i32 [[XOR375678_I]], i32 1) |
| ; CHECK-NEXT: [[XOR7_I:%.*]] = tail call i32 @llvm.fshl.i32(i32 [[XOR4_I]], i32 [[XOR316272_I]], i32 1) |
| ; CHECK-NEXT: [[AND22_I:%.*]] = and i32 [[XOR11_I]], [[XOR7_I]] |
| ; CHECK-NEXT: [[XOR23_I:%.*]] = xor i32 [[XOR18_I]], [[AND22_I]] |
| ; CHECK-NEXT: [[XOR32_I:%.*]] = xor i32 [[XOR23_I]], 1 |
| ; CHECK-NEXT: [[XOR35_I]] = tail call i32 @llvm.fshl.i32(i32 [[XOR32_I]], i32 [[XOR18_I]], i32 1) |
| ; CHECK-NEXT: [[AND36_I:%.*]] = and i32 [[XOR35_I]], 1 |
| ; CHECK-NEXT: [[XOR37_I]] = xor i32 [[AND36_I]], 1 |
| ; CHECK-NEXT: [[XOR14_I:%.*]] = tail call i32 @llvm.fshl.i32(i32 1, i32 [[XOR536470_I]], i32 1) |
| ; CHECK-NEXT: [[AND_I:%.*]] = and i32 [[XOR14_I]], [[XOR11_I]] |
| ; CHECK-NEXT: [[TMP0:%.*]] = xor i32 [[XOR4_I]], [[AND_I]] |
| ; CHECK-NEXT: [[XOR39_I:%.*]] = xor i32 [[TMP0]], 1 |
| ; CHECK-NEXT: [[XOR42_I:%.*]] = tail call i32 @llvm.fshl.i32(i32 [[XOR39_I]], i32 [[XOR23_I]], i32 1) |
| ; CHECK-NEXT: [[AND43_I]] = and i32 [[XOR42_I]], [[XOR4_I]] |
| ; CHECK-NEXT: [[XOR15_I:%.*]] = xor i32 [[XOR536470_I]], [[XOR4_I]] |
| ; CHECK-NEXT: [[XOR18_I3:%.*]] = tail call i32 @llvm.fshl.i32(i32 1, i32 [[XOR15_I]], i32 1) |
| ; CHECK-NEXT: [[AND25_I:%.*]] = and i32 [[XOR7_I]], [[XOR18_I3]] |
| ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND25_I]], [[XOR4_I]] |
| ; CHECK-NEXT: [[XOR45_I:%.*]] = xor i32 [[TMP1]], 1 |
| ; CHECK-NEXT: [[XOR48_I]] = tail call i32 @llvm.fshl.i32(i32 [[XOR45_I]], i32 1, i32 1) |
| ; CHECK-NEXT: [[XOR53_I]] = xor i32 [[XOR4_I]], 1 |
| ; CHECK-NEXT: br i1 [[TOBOOL_NOT_I]], label %[[EXIT:.*]], label %[[BB]] |
| ; CHECK: [[EXIT]]: |
| ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[XOR385777_I]], [[XOR445876_I]] |
| ; CHECK-NEXT: [[TMP3:%.*]] = xor i32 [[TMP2]], [[XOR505975_I]] |
| ; CHECK-NEXT: [[XOR2_I:%.*]] = xor i32 [[TMP3]], [[XOR375678_I]] |
| ; CHECK-NEXT: ret i32 [[XOR2_I]] |
| ; |
| entry: |
| br label %bb |
| |
| bb: |
| %xor375678.i = phi i32 [ 0, %entry ], [ %xor37.i, %bb ] |
| %xor385777.i = phi i32 [ 0, %entry ], [ %xor35.i, %bb ] |
| %xor445876.i = phi i32 [ 0, %entry ], [ %and43.i, %bb ] |
| %xor505975.i = phi i32 [ 0, %entry ], [ %xor48.i, %bb ] |
| %xor316272.i = phi i32 [ 0, %entry ], [ %xor31.i, %bb ] |
| %xor536470.i = phi i32 [ 0, %entry ], [ %xor53.i, %bb ] |
| %xor30.i = tail call i32 @llvm.fshl.i32(i32 %xor4.i, i32 1, i32 1) |
| %xor31.i = xor i32 %xor30.i, %xor4.i |
| %xor11.i = tail call i32 @llvm.fshl.i32(i32 %xor4.i, i32 %xor375678.i, i32 1) |
| %xor7.i = tail call i32 @llvm.fshl.i32(i32 %xor4.i, i32 %xor316272.i, i32 1) |
| %and22.i = and i32 %xor11.i, %xor7.i |
| %xor23.i = xor i32 %xor18.i, %and22.i |
| %xor32.i = xor i32 %xor23.i, 1 |
| %xor35.i = tail call i32 @llvm.fshl.i32(i32 %xor32.i, i32 %xor18.i, i32 1) |
| %and36.i = and i32 %xor35.i, 1 |
| %xor37.i = xor i32 %and36.i, 1 |
| %xor14.i = tail call i32 @llvm.fshl.i32(i32 1, i32 %xor536470.i, i32 1) |
| %and.i = and i32 %xor14.i, %xor11.i |
| %0 = xor i32 %xor4.i, %and.i |
| %xor39.i = xor i32 %0, 1 |
| %xor42.i = tail call i32 @llvm.fshl.i32(i32 %xor39.i, i32 %xor23.i, i32 1) |
| %and43.i = and i32 %xor42.i, %xor4.i |
| %xor15.i = xor i32 %xor536470.i, %xor4.i |
| %xor18.i3 = tail call i32 @llvm.fshl.i32(i32 1, i32 %xor15.i, i32 1) |
| %and25.i = and i32 %xor7.i, %xor18.i3 |
| %1 = xor i32 %and25.i, %xor4.i |
| %xor45.i = xor i32 %1, 1 |
| %xor48.i = tail call i32 @llvm.fshl.i32(i32 %xor45.i, i32 1, i32 1) |
| %xor53.i = xor i32 %xor4.i, 1 |
| br i1 %tobool.not.i, label %exit, label %bb |
| |
| exit: |
| %2 = xor i32 %xor385777.i, %xor445876.i |
| %3 = xor i32 %2, %xor505975.i |
| %xor2.i = xor i32 %3, %xor375678.i |
| ret i32 %xor2.i |
| } |
| |
| declare i32 @llvm.fshl.i32(i32, i32, i32) |
| |