| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt -S -O2 -mattr=avx < %s | FileCheck %s |
| ; RUN: opt -S -passes='default<O2>' -mattr=avx < %s | FileCheck %s |
| |
| target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| target triple = "x86_64-unknown-linux-gnu" |
| |
| ; FIXME: The br -> switch conversion blocks vectorization. |
| |
| define dso_local void @test(i32* %start, i32* %end) #0 { |
| ; CHECK-LABEL: @test( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[I11_NOT1:%.*]] = icmp eq i32* [[START:%.*]], [[END:%.*]] |
| ; CHECK-NEXT: br i1 [[I11_NOT1]], label [[EXIT:%.*]], label [[BB12:%.*]] |
| ; CHECK: bb12: |
| ; CHECK-NEXT: [[PTR2:%.*]] = phi i32* [ [[PTR_NEXT:%.*]], [[LATCH:%.*]] ], [ [[START]], [[ENTRY:%.*]] ] |
| ; CHECK-NEXT: [[VAL:%.*]] = load i32, i32* [[PTR2]], align 4 |
| ; CHECK-NEXT: switch i32 [[VAL]], label [[LATCH]] [ |
| ; CHECK-NEXT: i32 -12, label [[STORE:%.*]] |
| ; CHECK-NEXT: i32 13, label [[STORE]] |
| ; CHECK-NEXT: ] |
| ; CHECK: store: |
| ; CHECK-NEXT: store i32 42, i32* [[PTR2]], align 4 |
| ; CHECK-NEXT: br label [[LATCH]] |
| ; CHECK: latch: |
| ; CHECK-NEXT: [[PTR_NEXT]] = getelementptr inbounds i32, i32* [[PTR2]], i64 1 |
| ; CHECK-NEXT: [[I11_NOT:%.*]] = icmp eq i32* [[PTR_NEXT]], [[END]] |
| ; CHECK-NEXT: br i1 [[I11_NOT]], label [[EXIT]], label [[BB12]] |
| ; CHECK: exit: |
| ; CHECK-NEXT: ret void |
| ; |
| entry: |
| br label %header |
| |
| header: |
| %ptr = phi i32* [ %start, %entry ], [ %ptr.next, %latch ] |
| %i11 = icmp ne i32* %ptr, %end |
| br i1 %i11, label %bb12, label %exit |
| |
| bb12: |
| %val = load i32, i32* %ptr, align 4 |
| %c1 = icmp eq i32 %val, 13 |
| %c2 = icmp eq i32 %val, -12 |
| %c3 = or i1 %c1, %c2 |
| br i1 %c3, label %store, label %latch |
| |
| store: |
| store i32 42, i32* %ptr, align 4 |
| br label %latch |
| |
| latch: |
| %ptr.next = getelementptr inbounds i32, i32* %ptr, i32 1 |
| br label %header |
| |
| exit: |
| ret void |
| } |