diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-05-17 20:22:39 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-05-17 20:22:39 +0000 |
commit | 7af96fb3afd6725a2824a0a5ca5dad34e5e0b056 (patch) | |
tree | 6661ffbabf869009597684462f5a3df3beccc952 /test/Transforms | |
parent | 6b3f41ed88e8e440e11a4fbf20b6600529f80049 (diff) |
Diffstat (limited to 'test/Transforms')
-rw-r--r-- | test/Transforms/Coroutines/coro-catchswitch.ll | 88 | ||||
-rw-r--r-- | test/Transforms/Inline/inline-hot-callee.ll | 10 | ||||
-rw-r--r-- | test/Transforms/InstCombine/canonicalize_branch.ll | 513 | ||||
-rw-r--r-- | test/Transforms/InstCombine/debuginfo-skip.ll | 44 | ||||
-rw-r--r-- | test/Transforms/InstSimplify/AndOrXor.ll | 12 | ||||
-rw-r--r-- | test/Transforms/LoopVectorize/AArch64/pr33053.ll | 56 | ||||
-rw-r--r-- | test/Transforms/LoopVectorize/AArch64/reduction-small-size.ll | 26 | ||||
-rw-r--r-- | test/Transforms/NewGVN/pr32934.ll | 1 | ||||
-rw-r--r-- | test/Transforms/SLPVectorizer/AArch64/gather-root.ll | 40 |
9 files changed, 680 insertions, 110 deletions
diff --git a/test/Transforms/Coroutines/coro-catchswitch.ll b/test/Transforms/Coroutines/coro-catchswitch.ll new file mode 100644 index 0000000000000..dd06f1280caed --- /dev/null +++ b/test/Transforms/Coroutines/coro-catchswitch.ll @@ -0,0 +1,88 @@ +; Verifies that we can insert the spill for a PHI preceding the catchswitch +; RUN: opt < %s -coro-split -S | FileCheck %s + +target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" +target triple = "i686-pc-windows-msvc" + +; CHECK-LABEL: define void @f( +define void @f(i1 %cond) "coroutine.presplit"="1" personality i32 0 { +entry: + %id = call token @llvm.coro.id(i32 8, i8* null, i8* null, i8* null) + %size = call i32 @llvm.coro.size.i32() + %alloc = call i8* @malloc(i32 %size) + %hdl = call i8* @llvm.coro.begin(token %id, i8* %alloc) + br i1 %cond, label %if.else, label %if.then + +if.then: + invoke void @may_throw1() + to label %coro.ret unwind label %catch.dispatch + +if.else: + invoke void @may_throw2() + to label %coro.ret unwind label %catch.dispatch + +catch.dispatch: ; preds = %if.else, %if.then + %val = phi i32 [ 1, %if.then ], [ 2, %if.else ] + %switch = catchswitch within none [label %catch] unwind label %cleanuppad + +; Verifies that we split out the PHI into a separate block +; added a cleanuppad spill cleanupret unwinding into the catchswitch. + +; CHECK: catch.dispatch: +; CHECK: %val = phi i32 [ 2, %if.else ], [ 1, %if.then ] +; CHECK: %[[Pad:.+]] = cleanuppad within none [] +; CHECK: %val.spill.addr = getelementptr inbounds %f.Frame, %f.Frame* %FramePtr, i32 0, i32 4 +; CHECK: store i32 %val, i32* %val.spill.addr +; CHECK: cleanupret from %[[Pad]] unwind label %[[Switch:.+]] + +; CHECK: [[Switch]]: +; CHECK: %switch = catchswitch within none [label %catch] unwind to caller + +catch: ; preds = %catch.dispatch + %pad = catchpad within %switch [i8* null, i32 64, i8* null] + catchret from %pad to label %suspend + +suspend: + %sp = call i8 @llvm.coro.suspend(token none, i1 false) + switch i8 %sp, label %coro.ret [ + i8 0, label %resume + i8 1, label %coro.ret + ] + +resume: ; preds = %await2.suspend + call void @print(i32 %val) + br label %coro.ret + +coro.ret: + call i1 @llvm.coro.end(i8* %hdl, i1 0) + ret void + +cleanuppad: + %cpad = cleanuppad within none [] + cleanupret from %cpad unwind to caller +} + +; Function Attrs: argmemonly nounwind readonly +declare token @llvm.coro.id(i32, i8* readnone, i8* nocapture readonly, i8*) #1 + +; Function Attrs: nounwind +declare i1 @llvm.coro.alloc(token) #2 + +; Function Attrs: nobuiltin +declare i32 @llvm.coro.size.i32() #4 +declare i8* @llvm.coro.begin(token, i8* writeonly) #2 +declare token @llvm.coro.save(i8*) +declare i8 @llvm.coro.suspend(token, i1) + +declare void @may_throw1() +declare void @may_throw2() +declare void @print(i32) +declare noalias i8* @malloc(i32) +declare void @free(i8*) + +declare i1 @llvm.coro.end(i8*, i1) #2 + +; Function Attrs: nobuiltin nounwind + +; Function Attrs: argmemonly nounwind readonly +declare i8* @llvm.coro.free(token, i8* nocapture readonly) #1 diff --git a/test/Transforms/Inline/inline-hot-callee.ll b/test/Transforms/Inline/inline-hot-callee.ll index da6e52343b2d5..dad57440063bd 100644 --- a/test/Transforms/Inline/inline-hot-callee.ll +++ b/test/Transforms/Inline/inline-hot-callee.ll @@ -1,10 +1,10 @@ ; RUN: opt < %s -inline -inline-threshold=0 -inlinehint-threshold=100 -S | FileCheck %s -; RUN: opt < %s -passes='require<profile-summary>,cgscc(inline)' -inline-threshold=0 -inlinehint-threshold=100 -S | FileCheck %s -; This tests that a hot callee gets the (higher) inlinehint-threshold even without -; inline hints and gets inlined because the cost is less than inlinehint-threshold. -; A cold callee with identical body does not get inlined because cost exceeds the -; inline-threshold +; This tests that a hot callee gets the (higher) inlinehint-threshold even +; without inline hints and gets inlined because the cost is less than +; inlinehint-threshold. A cold callee with identical body does not get inlined +; because cost exceeds the inline-threshold. This test is relevant only when the +; old pass manager is used. define i32 @callee1(i32 %x) !prof !21 { %x1 = add i32 %x, 1 diff --git a/test/Transforms/InstCombine/canonicalize_branch.ll b/test/Transforms/InstCombine/canonicalize_branch.ll index 29fd51a39ab4c..401490879e92d 100644 --- a/test/Transforms/InstCombine/canonicalize_branch.ll +++ b/test/Transforms/InstCombine/canonicalize_branch.ll @@ -1,69 +1,500 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -instcombine -S | FileCheck %s ; Test an already canonical branch to make sure we don't flip those. -define i32 @test0(i32 %X, i32 %Y) { - %C = icmp eq i32 %X, %Y - br i1 %C, label %T, label %F, !prof !0 +define i32 @eq(i32 %X, i32 %Y) { +; CHECK-LABEL: @eq( +; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !0 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = icmp eq i32 %X, %Y + br i1 %C, label %T, label %F, !prof !0 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @ne(i32 %X, i32 %Y) { +; CHECK-LABEL: @ne( +; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[F:%.*]], label [[T:%.*]], !prof !1 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = icmp ne i32 %X, %Y + br i1 %C, label %T, label %F, !prof !1 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @ugt(i32 %X, i32 %Y) { +; CHECK-LABEL: @ugt( +; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !2 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = icmp ugt i32 %X, %Y + br i1 %C, label %T, label %F, !prof !2 +T: + ret i32 12 +F: + ret i32 123 +} -; CHECK-LABEL: @test0( -; CHECK: %C = icmp eq i32 %X, %Y -; CHECK: br i1 %C, label %T, label %F +define i32 @uge(i32 %X, i32 %Y) { +; CHECK-LABEL: @uge( +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[F:%.*]], label [[T:%.*]], !prof !3 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = icmp uge i32 %X, %Y + br i1 %C, label %T, label %F, !prof !3 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @ult(i32 %X, i32 %Y) { +; CHECK-LABEL: @ult( +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !4 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = icmp ult i32 %X, %Y + br i1 %C, label %T, label %F, !prof !4 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @ule(i32 %X, i32 %Y) { +; CHECK-LABEL: @ule( +; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[F:%.*]], label [[T:%.*]], !prof !5 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = icmp ule i32 %X, %Y + br i1 %C, label %T, label %F, !prof !5 +T: + ret i32 12 +F: + ret i32 123 +} +define i32 @sgt(i32 %X, i32 %Y) { +; CHECK-LABEL: @sgt( +; CHECK-NEXT: [[C:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !6 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = icmp sgt i32 %X, %Y + br i1 %C, label %T, label %F, !prof !6 T: - ret i32 12 + ret i32 12 F: - ret i32 123 + ret i32 123 } -define i32 @test1(i32 %X, i32 %Y) { - %C = icmp ne i32 %X, %Y - br i1 %C, label %T, label %F, !prof !1 +define i32 @sge(i32 %X, i32 %Y) { +; CHECK-LABEL: @sge( +; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[F:%.*]], label [[T:%.*]], !prof !7 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = icmp sge i32 %X, %Y + br i1 %C, label %T, label %F, !prof !7 +T: + ret i32 12 +F: + ret i32 123 +} -; CHECK-LABEL: @test1( -; CHECK: %C = icmp eq i32 %X, %Y -; CHECK: br i1 %C, label %F, label %T +define i32 @slt(i32 %X, i32 %Y) { +; CHECK-LABEL: @slt( +; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !8 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = icmp slt i32 %X, %Y + br i1 %C, label %T, label %F, !prof !8 +T: + ret i32 12 +F: + ret i32 123 +} +define i32 @sle(i32 %X, i32 %Y) { +; CHECK-LABEL: @sle( +; CHECK-NEXT: [[C:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[F:%.*]], label [[T:%.*]], !prof !9 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = icmp sle i32 %X, %Y + br i1 %C, label %T, label %F, !prof !9 T: - ret i32 12 + ret i32 12 F: - ret i32 123 + ret i32 123 } -define i32 @test2(i32 %X, i32 %Y) { - %C = icmp ule i32 %X, %Y - br i1 %C, label %T, label %F, !prof !2 +define i32 @f_false(float %X, float %Y) { +; CHECK-LABEL: @f_false( +; CHECK-NEXT: br i1 false, label [[T:%.*]], label [[F:%.*]], !prof !10 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp false float %X, %Y + br i1 %C, label %T, label %F, !prof !10 +T: + ret i32 12 +F: + ret i32 123 +} -; CHECK-LABEL: @test2( -; CHECK: %C = icmp ugt i32 %X, %Y -; CHECK: br i1 %C, label %F, label %T +define i32 @f_oeq(float %X, float %Y) { +; CHECK-LABEL: @f_oeq( +; CHECK-NEXT: [[C:%.*]] = fcmp oeq float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !11 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp oeq float %X, %Y + br i1 %C, label %T, label %F, !prof !11 +T: + ret i32 12 +F: + ret i32 123 +} +define i32 @f_ogt(float %X, float %Y) { +; CHECK-LABEL: @f_ogt( +; CHECK-NEXT: [[C:%.*]] = fcmp ogt float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !12 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp ogt float %X, %Y + br i1 %C, label %T, label %F, !prof !12 T: - ret i32 12 + ret i32 12 F: - ret i32 123 + ret i32 123 } -define i32 @test3(i32 %X, i32 %Y) { - %C = icmp uge i32 %X, %Y - br i1 %C, label %T, label %F, !prof !3 +define i32 @f_oge(float %X, float %Y) { +; CHECK-LABEL: @f_oge( +; CHECK-NEXT: [[C:%.*]] = fcmp ult float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[F:%.*]], label [[T:%.*]], !prof !13 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp oge float %X, %Y + br i1 %C, label %T, label %F, !prof !13 +T: + ret i32 12 +F: + ret i32 123 +} -; CHECK-LABEL: @test3( -; CHECK: %C = icmp ult i32 %X, %Y -; CHECK: br i1 %C, label %F, label %T +define i32 @f_olt(float %X, float %Y) { +; CHECK-LABEL: @f_olt( +; CHECK-NEXT: [[C:%.*]] = fcmp olt float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !14 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp olt float %X, %Y + br i1 %C, label %T, label %F, !prof !14 +T: + ret i32 12 +F: + ret i32 123 +} +define i32 @f_ole(float %X, float %Y) { +; CHECK-LABEL: @f_ole( +; CHECK-NEXT: [[C:%.*]] = fcmp ugt float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[F:%.*]], label [[T:%.*]], !prof !15 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp ole float %X, %Y + br i1 %C, label %T, label %F, !prof !15 T: - ret i32 12 + ret i32 12 F: - ret i32 123 + ret i32 123 } -!0 = !{!"branch_weights", i32 1, i32 2} -!1 = !{!"branch_weights", i32 3, i32 4} -!2 = !{!"branch_weights", i32 5, i32 6} -!3 = !{!"branch_weights", i32 7, i32 8} -; Base case shouldn't change. -; CHECK: !0 = {{.*}} i32 1, i32 2} +define i32 @f_one(float %X, float %Y) { +; CHECK-LABEL: @f_one( +; CHECK-NEXT: [[C:%.*]] = fcmp ueq float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[F:%.*]], label [[T:%.*]], !prof !16 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp one float %X, %Y + br i1 %C, label %T, label %F, !prof !16 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @f_ord(float %X, float %Y) { +; CHECK-LABEL: @f_ord( +; CHECK-NEXT: [[C:%.*]] = fcmp ord float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !17 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp ord float %X, %Y + br i1 %C, label %T, label %F, !prof !17 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @f_uno(float %X, float %Y) { +; CHECK-LABEL: @f_uno( +; CHECK-NEXT: [[C:%.*]] = fcmp uno float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !18 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp uno float %X, %Y + br i1 %C, label %T, label %F, !prof !18 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @f_ueq(float %X, float %Y) { +; CHECK-LABEL: @f_ueq( +; CHECK-NEXT: [[C:%.*]] = fcmp ueq float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !19 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp ueq float %X, %Y + br i1 %C, label %T, label %F, !prof !19 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @f_ugt(float %X, float %Y) { +; CHECK-LABEL: @f_ugt( +; CHECK-NEXT: [[C:%.*]] = fcmp ugt float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !20 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp ugt float %X, %Y + br i1 %C, label %T, label %F, !prof !20 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @f_uge(float %X, float %Y) { +; CHECK-LABEL: @f_uge( +; CHECK-NEXT: [[C:%.*]] = fcmp uge float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !21 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp uge float %X, %Y + br i1 %C, label %T, label %F, !prof !21 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @f_ult(float %X, float %Y) { +; CHECK-LABEL: @f_ult( +; CHECK-NEXT: [[C:%.*]] = fcmp ult float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !22 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp ult float %X, %Y + br i1 %C, label %T, label %F, !prof !22 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @f_ule(float %X, float %Y) { +; CHECK-LABEL: @f_ule( +; CHECK-NEXT: [[C:%.*]] = fcmp ule float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !23 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp ule float %X, %Y + br i1 %C, label %T, label %F, !prof !23 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @f_une(float %X, float %Y) { +; CHECK-LABEL: @f_une( +; CHECK-NEXT: [[C:%.*]] = fcmp une float [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]], !prof !24 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp une float %X, %Y + br i1 %C, label %T, label %F, !prof !24 +T: + ret i32 12 +F: + ret i32 123 +} + +define i32 @f_true(float %X, float %Y) { +; CHECK-LABEL: @f_true( +; CHECK-NEXT: br i1 true, label [[T:%.*]], label [[F:%.*]], !prof !25 +; CHECK: T: +; CHECK-NEXT: ret i32 12 +; CHECK: F: +; CHECK-NEXT: ret i32 123 +; + %C = fcmp true float %X, %Y + br i1 %C, label %T, label %F, !prof !25 +T: + ret i32 12 +F: + ret i32 123 +} + + +!0 = !{!"branch_weights", i32 0, i32 99} +!1 = !{!"branch_weights", i32 1, i32 99} +!2 = !{!"branch_weights", i32 2, i32 99} +!3 = !{!"branch_weights", i32 3, i32 99} +!4 = !{!"branch_weights", i32 4, i32 99} +!5 = !{!"branch_weights", i32 5, i32 99} +!6 = !{!"branch_weights", i32 6, i32 99} +!7 = !{!"branch_weights", i32 7, i32 99} +!8 = !{!"branch_weights", i32 8, i32 99} +!9 = !{!"branch_weights", i32 9, i32 99} +!10 = !{!"branch_weights", i32 10, i32 99} +!11 = !{!"branch_weights", i32 11, i32 99} +!12 = !{!"branch_weights", i32 12, i32 99} +!13 = !{!"branch_weights", i32 13, i32 99} +!14 = !{!"branch_weights", i32 14, i32 99} +!15 = !{!"branch_weights", i32 15, i32 99} +!16 = !{!"branch_weights", i32 16, i32 99} +!17 = !{!"branch_weights", i32 17, i32 99} +!18 = !{!"branch_weights", i32 18, i32 99} +!19 = !{!"branch_weights", i32 19, i32 99} +!20 = !{!"branch_weights", i32 20, i32 99} +!21 = !{!"branch_weights", i32 21, i32 99} +!22 = !{!"branch_weights", i32 22, i32 99} +!23 = !{!"branch_weights", i32 23, i32 99} +!24 = !{!"branch_weights", i32 24, i32 99} +!25 = !{!"branch_weights", i32 25, i32 99} + ; Ensure that the branch metadata is reversed to match the reversals above. -; CHECK: !1 = {{.*}} i32 4, i32 3} -; CHECK: !2 = {{.*}} i32 6, i32 5} -; CHECK: !3 = {{.*}} i32 8, i32 7} +; CHECK: !0 = {{.*}} i32 0, i32 99} +; CHECK: !1 = {{.*}} i32 99, i32 1} +; CHECK: !2 = {{.*}} i32 2, i32 99} +; CHECK: !3 = {{.*}} i32 99, i32 3} +; CHECK: !4 = {{.*}} i32 4, i32 99} +; CHECK: !5 = {{.*}} i32 99, i32 5} +; CHECK: !6 = {{.*}} i32 6, i32 99} +; CHECK: !7 = {{.*}} i32 99, i32 7} +; CHECK: !8 = {{.*}} i32 8, i32 99} +; CHECK: !9 = {{.*}} i32 99, i32 9} +; CHECK: !10 = {{.*}} i32 10, i32 99} +; CHECK: !11 = {{.*}} i32 11, i32 99} +; CHECK: !12 = {{.*}} i32 12, i32 99} +; CHECK: !13 = {{.*}} i32 99, i32 13} +; CHECK: !14 = {{.*}} i32 14, i32 99} +; CHECK: !15 = {{.*}} i32 99, i32 15} +; CHECK: !16 = {{.*}} i32 99, i32 16} +; CHECK: !17 = {{.*}} i32 17, i32 99} +; CHECK: !18 = {{.*}} i32 18, i32 99} +; CHECK: !19 = {{.*}} i32 19, i32 99} +; CHECK: !20 = {{.*}} i32 20, i32 99} +; CHECK: !21 = {{.*}} i32 21, i32 99} +; CHECK: !22 = {{.*}} i32 22, i32 99} +; CHECK: !23 = {{.*}} i32 23, i32 99} +; CHECK: !24 = {{.*}} i32 24, i32 99} +; CHECK: !25 = {{.*}} i32 25, i32 99} + diff --git a/test/Transforms/InstCombine/debuginfo-skip.ll b/test/Transforms/InstCombine/debuginfo-skip.ll new file mode 100644 index 0000000000000..d2295e29ee46a --- /dev/null +++ b/test/Transforms/InstCombine/debuginfo-skip.ll @@ -0,0 +1,44 @@ +; RUN: opt < %s -instcombine -debug -S -o %t 2>&1 | FileCheck %s +; RUN: cat %t | FileCheck %s --check-prefix=CHECK-IR +; REQUIRES: asserts + +; Debug output from InstCombine should not have any @llvm.dbg.* instructions visited +; CHECK-NOT: call void @llvm.dbg. + +; The resulting IR should still have them +; CHECK-IR: call void @llvm.dbg. + +define i32 @foo(i32 %j) #0 !dbg !7 { +entry: + %j.addr = alloca i32, align 4 + store i32 %j, i32* %j.addr, align 4 + call void @llvm.dbg.declare(metadata i32* %j.addr, metadata !11, metadata !12), !dbg !13 + call void @llvm.dbg.value(metadata i32 10, i64 0, metadata !16, metadata !12), !dbg !15 + %0 = load i32, i32* %j.addr, align 4, !dbg !14 + ret i32 %0, !dbg !15 +} + +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 +declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1 + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4, !5} +!llvm.ident = !{!6} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang 5.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug) +!1 = !DIFile(filename: "a.c", directory: "/tmp") +!2 = !{} +!3 = !{i32 2, !"Dwarf Version", i32 4} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{i32 1, !"PIC Level", i32 2} +!6 = !{!"clang version 5.0.0 (trunk 302918) (llvm/trunk 302925)"} +!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 2, type: !8, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2) +!8 = !DISubroutineType(types: !9) +!9 = !{!10, !10} +!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!11 = !DILocalVariable(name: "j", arg: 1, scope: !7, file: !1, line: 2, type: !10) +!12 = !DIExpression() +!13 = !DILocation(line: 2, column: 13, scope: !7) +!14 = !DILocation(line: 5, column: 10, scope: !7) +!15 = !DILocation(line: 5, column: 3, scope: !7) +!16 = !DILocalVariable(name: "h", scope: !7, file: !1, line: 4, type: !10) diff --git a/test/Transforms/InstSimplify/AndOrXor.ll b/test/Transforms/InstSimplify/AndOrXor.ll index 427ea655fcb2b..a9b4e4e5cfcc7 100644 --- a/test/Transforms/InstSimplify/AndOrXor.ll +++ b/test/Transforms/InstSimplify/AndOrXor.ll @@ -738,8 +738,7 @@ define i32 @test54(i32 %a, i32 %b) { define i8 @lshr_perfect_mask(i8 %x) { ; CHECK-LABEL: @lshr_perfect_mask( ; CHECK-NEXT: [[SH:%.*]] = lshr i8 %x, 5 -; CHECK-NEXT: [[MASK:%.*]] = and i8 [[SH]], 7 -; CHECK-NEXT: ret i8 [[MASK]] +; CHECK-NEXT: ret i8 [[SH]] ; %sh = lshr i8 %x, 5 %mask = and i8 %sh, 7 ; 0x07 @@ -749,8 +748,7 @@ define i8 @lshr_perfect_mask(i8 %x) { define <2 x i8> @lshr_oversized_mask_splat(<2 x i8> %x) { ; CHECK-LABEL: @lshr_oversized_mask_splat( ; CHECK-NEXT: [[SH:%.*]] = lshr <2 x i8> %x, <i8 5, i8 5> -; CHECK-NEXT: [[MASK:%.*]] = and <2 x i8> [[SH]], <i8 -121, i8 -121> -; CHECK-NEXT: ret <2 x i8> [[MASK]] +; CHECK-NEXT: ret <2 x i8> [[SH]] ; %sh = lshr <2 x i8> %x, <i8 5, i8 5> %mask = and <2 x i8> %sh, <i8 135, i8 135> ; 0x87 @@ -771,8 +769,7 @@ define i8 @lshr_undersized_mask(i8 %x) { define <2 x i8> @shl_perfect_mask_splat(<2 x i8> %x) { ; CHECK-LABEL: @shl_perfect_mask_splat( ; CHECK-NEXT: [[SH:%.*]] = shl <2 x i8> %x, <i8 6, i8 6> -; CHECK-NEXT: [[MASK:%.*]] = and <2 x i8> [[SH]], <i8 -64, i8 -64> -; CHECK-NEXT: ret <2 x i8> [[MASK]] +; CHECK-NEXT: ret <2 x i8> [[SH]] ; %sh = shl <2 x i8> %x, <i8 6, i8 6> %mask = and <2 x i8> %sh, <i8 192, i8 192> ; 0xC0 @@ -782,8 +779,7 @@ define <2 x i8> @shl_perfect_mask_splat(<2 x i8> %x) { define i8 @shl_oversized_mask(i8 %x) { ; CHECK-LABEL: @shl_oversized_mask( ; CHECK-NEXT: [[SH:%.*]] = shl i8 %x, 6 -; CHECK-NEXT: [[MASK:%.*]] = and i8 [[SH]], -61 -; CHECK-NEXT: ret i8 [[MASK]] +; CHECK-NEXT: ret i8 [[SH]] ; %sh = shl i8 %x, 6 %mask = and i8 %sh, 195 ; 0xC3 diff --git a/test/Transforms/LoopVectorize/AArch64/pr33053.ll b/test/Transforms/LoopVectorize/AArch64/pr33053.ll new file mode 100644 index 0000000000000..6763940bf98ea --- /dev/null +++ b/test/Transforms/LoopVectorize/AArch64/pr33053.ll @@ -0,0 +1,56 @@ +; RUN: opt -S -mtriple=aarch64 -loop-vectorize -force-vector-width=2 < %s | FileCheck %s +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +target triple = "aarch64--linux-gnu" + +@b = common local_unnamed_addr global i32 0, align 4 +@a = common local_unnamed_addr global i16* null, align 8 + +; Function Attrs: norecurse nounwind readonly +define i32 @fn1() local_unnamed_addr #0 { +; Ensure that we don't emit reduction intrinsics for unsupported short reductions. +; CHECK-NOT: @llvm.experimental.vector.reduce +entry: + %0 = load i32, i32* @b, align 4, !tbaa !1 + %cmp40 = icmp sgt i32 %0, 0 + br i1 %cmp40, label %for.body.lr.ph, label %for.end + +for.body.lr.ph: ; preds = %entry + %1 = load i16*, i16** @a, align 8, !tbaa !5 + %2 = load i32, i32* @b, align 4, !tbaa !1 + %3 = sext i32 %2 to i64 + br label %for.body + +for.body: ; preds = %for.body.lr.ph, %for.body + %indvars.iv = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next, %for.body ] + %d.043 = phi i16 [ undef, %for.body.lr.ph ], [ %.sink28, %for.body ] + %c.042 = phi i16 [ undef, %for.body.lr.ph ], [ %c.0., %for.body ] + %arrayidx = getelementptr inbounds i16, i16* %1, i64 %indvars.iv + %4 = load i16, i16* %arrayidx, align 2, !tbaa !7 + %cmp2 = icmp sgt i16 %c.042, %4 + %c.0. = select i1 %cmp2, i16 %c.042, i16 %4 + %cmp13 = icmp slt i16 %d.043, %4 + %.sink28 = select i1 %cmp13, i16 %d.043, i16 %4 + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + %cmp = icmp slt i64 %indvars.iv.next, %3 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.body, %entry + %c.0.lcssa = phi i16 [ undef, %entry ], [ %c.0., %for.body ] + %d.0.lcssa = phi i16 [ undef, %entry ], [ %.sink28, %for.body ] + %cmp26 = icmp sgt i16 %c.0.lcssa, %d.0.lcssa + %conv27 = zext i1 %cmp26 to i32 + ret i32 %conv27 +} + +attributes #0 = { norecurse nounwind readonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+neon" "unsafe-fp-math"="false" "use-soft-float"="false" } +!llvm.ident = !{!0} + +!0 = !{!"clang"} +!1 = !{!2, !2, i64 0} +!2 = !{!"int", !3, i64 0} +!3 = !{!"omnipotent char", !4, i64 0} +!4 = !{!"Simple C/C++ TBAA"} +!5 = !{!6, !6, i64 0} +!6 = !{!"any pointer", !3, i64 0} +!7 = !{!8, !8, i64 0} +!8 = !{!"short", !3, i64 0} diff --git a/test/Transforms/LoopVectorize/AArch64/reduction-small-size.ll b/test/Transforms/LoopVectorize/AArch64/reduction-small-size.ll index be08a63b212c0..9d9aea00e9a91 100644 --- a/test/Transforms/LoopVectorize/AArch64/reduction-small-size.ll +++ b/test/Transforms/LoopVectorize/AArch64/reduction-small-size.ll @@ -20,15 +20,7 @@ target triple = "aarch64--linux-gnu" ; CHECK: add <16 x i8> ; ; CHECK: middle.block: -; CHECK: shufflevector <16 x i8> -; CHECK: add <16 x i8> -; CHECK: shufflevector <16 x i8> -; CHECK: add <16 x i8> -; CHECK: shufflevector <16 x i8> -; CHECK: add <16 x i8> -; CHECK: shufflevector <16 x i8> -; CHECK: add <16 x i8> -; CHECK: [[Rdx:%[a-zA-Z0-9.]+]] = extractelement <16 x i8> +; CHECK: [[Rdx:%[a-zA-Z0-9.]+]] = call i8 @llvm.experimental.vector.reduce.add.i8.v16i8(<16 x i8> ; CHECK: zext i8 [[Rdx]] to i32 ; define i8 @reduction_i8(i8* nocapture readonly %a, i8* nocapture readonly %b, i32 %n) { @@ -83,13 +75,7 @@ for.body: ; CHECK: add <8 x i16> ; ; CHECK: middle.block: -; CHECK: shufflevector <8 x i16> -; CHECK: add <8 x i16> -; CHECK: shufflevector <8 x i16> -; CHECK: add <8 x i16> -; CHECK: shufflevector <8 x i16> -; CHECK: add <8 x i16> -; CHECK: [[Rdx:%[a-zA-Z0-9.]+]] = extractelement <8 x i16> +; CHECK: [[Rdx:%[a-zA-Z0-9.]+]] = call i16 @llvm.experimental.vector.reduce.add.i16.v8i16(<8 x i16> ; CHECK: zext i16 [[Rdx]] to i32 ; define i16 @reduction_i16_1(i16* nocapture readonly %a, i16* nocapture readonly %b, i32 %n) { @@ -146,13 +132,7 @@ for.body: ; CHECK: add <8 x i16> ; ; CHECK: middle.block: -; CHECK: shufflevector <8 x i16> -; CHECK: add <8 x i16> -; CHECK: shufflevector <8 x i16> -; CHECK: add <8 x i16> -; CHECK: shufflevector <8 x i16> -; CHECK: add <8 x i16> -; CHECK: [[Rdx:%[a-zA-Z0-9.]+]] = extractelement <8 x i16> +; CHECK: [[Rdx:%[a-zA-Z0-9.]+]] = call i16 @llvm.experimental.vector.reduce.add.i16.v8i16(<8 x i16> ; CHECK: zext i16 [[Rdx]] to i32 ; define i16 @reduction_i16_2(i8* nocapture readonly %a, i8* nocapture readonly %b, i32 %n) { diff --git a/test/Transforms/NewGVN/pr32934.ll b/test/Transforms/NewGVN/pr32934.ll index 4bb7ea1504372..c71611f782c75 100644 --- a/test/Transforms/NewGVN/pr32934.ll +++ b/test/Transforms/NewGVN/pr32934.ll @@ -1,4 +1,3 @@ -; REQUIRES: disabled ; RUN: opt -S -newgvn %s | FileCheck %s ; CHECK: define void @tinkywinky() { diff --git a/test/Transforms/SLPVectorizer/AArch64/gather-root.ll b/test/Transforms/SLPVectorizer/AArch64/gather-root.ll index b7fa5452f2518..68d6ebd27a5c2 100644 --- a/test/Transforms/SLPVectorizer/AArch64/gather-root.ll +++ b/test/Transforms/SLPVectorizer/AArch64/gather-root.ll @@ -11,14 +11,8 @@ target triple = "aarch64--linux-gnu" ; DEFAULT-LABEL: @PR28330( ; DEFAULT: %tmp17 = phi i32 [ %bin.extra, %for.body ], [ 0, %entry ] ; DEFAULT: %[[S0:.+]] = select <8 x i1> %1, <8 x i32> <i32 -720, i32 -720, i32 -720, i32 -720, i32 -720, i32 -720, i32 -720, i32 -720>, <8 x i32> <i32 -80, i32 -80, i32 -80, i32 -80, i32 -80, i32 -80, i32 -80, i32 -80> -; DEFAULT: %[[R0:.+]] = shufflevector <8 x i32> %[[S0]], <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef> -; DEFAULT: %[[R1:.+]] = add <8 x i32> %[[S0]], %[[R0]] -; DEFAULT: %[[R2:.+]] = shufflevector <8 x i32> %[[R1]], <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> -; DEFAULT: %[[R3:.+]] = add <8 x i32> %[[R1]], %[[R2]] -; DEFAULT: %[[R4:.+]] = shufflevector <8 x i32> %[[R3]], <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> -; DEFAULT: %[[R5:.+]] = add <8 x i32> %[[R3]], %[[R4]] -; DEFAULT: %[[R6:.+]] = extractelement <8 x i32> %[[R5]], i32 0 -; DEFAULT: %bin.extra = add i32 %[[R6]], %tmp17 +; DEFAULT: %[[Rdx:.+]] = call i32 @llvm.experimental.vector.reduce.add.i32.v8i32(<8 x i32> %[[S0]]) +; DEFAULT: %bin.extra = add i32 %[[Rdx]], %tmp17 ; ; GATHER-LABEL: @PR28330( ; GATHER: %tmp17 = phi i32 [ %bin.extra, %for.body ], [ 0, %entry ] @@ -38,14 +32,8 @@ target triple = "aarch64--linux-gnu" ; GATHER: %[[I5:.+]] = insertelement <8 x i32> %[[I4]], i32 %tmp29, i32 5 ; GATHER: %[[I6:.+]] = insertelement <8 x i32> %[[I5]], i32 %tmp31, i32 6 ; GATHER: %[[I7:.+]] = insertelement <8 x i32> %[[I6]], i32 %tmp33, i32 7 -; GATHER: %[[R0:.+]] = shufflevector <8 x i32> %[[I7]], <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef> -; GATHER: %[[R1:.+]] = add <8 x i32> %[[I7]], %[[R0]] -; GATHER: %[[R2:.+]] = shufflevector <8 x i32> %[[R1]], <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> -; GATHER: %[[R3:.+]] = add <8 x i32> %[[R1]], %[[R2]] -; GATHER: %[[R4:.+]] = shufflevector <8 x i32> %[[R3]], <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> -; GATHER: %[[R5:.+]] = add <8 x i32> %[[R3]], %[[R4]] -; GATHER: %[[R6:.+]] = extractelement <8 x i32> %[[R5]], i32 0 -; GATHER: %bin.extra = add i32 %[[R6]], %tmp17 +; GATHER: %[[Rdx:.+]] = call i32 @llvm.experimental.vector.reduce.add.i32.v8i32(<8 x i32> %[[I7]]) +; GATHER: %bin.extra = add i32 %[[Rdx]], %tmp17 ; ; MAX-COST-LABEL: @PR28330( ; MAX-COST-NOT: shufflevector @@ -107,14 +95,8 @@ define void @PR32038(i32 %n) { ; DEFAULT-NEXT: [[TMP28:%.*]] = add i32 [[TMP26]], undef ; DEFAULT-NEXT: [[TMP30:%.*]] = add i32 [[TMP28]], undef ; DEFAULT-NEXT: [[TMP32:%.*]] = add i32 [[TMP30]], undef -; DEFAULT-NEXT: [[RDX_SHUF:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef> -; DEFAULT-NEXT: [[BIN_RDX:%.*]] = add <8 x i32> [[TMP2]], [[RDX_SHUF]] -; DEFAULT-NEXT: [[RDX_SHUF1:%.*]] = shufflevector <8 x i32> [[BIN_RDX]], <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> -; DEFAULT-NEXT: [[BIN_RDX2:%.*]] = add <8 x i32> [[BIN_RDX]], [[RDX_SHUF1]] -; DEFAULT-NEXT: [[RDX_SHUF3:%.*]] = shufflevector <8 x i32> [[BIN_RDX2]], <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> -; DEFAULT-NEXT: [[BIN_RDX4:%.*]] = add <8 x i32> [[BIN_RDX2]], [[RDX_SHUF3]] -; DEFAULT-NEXT: [[TMP3:%.*]] = extractelement <8 x i32> [[BIN_RDX4]], i32 0 -; DEFAULT-NEXT: [[BIN_EXTRA]] = add i32 [[TMP3]], -5 +; DEFAULT-NEXT: [[Rdx:%.*]] = call i32 @llvm.experimental.vector.reduce.add.i32.v8i32(<8 x i32> [[TMP2]]) +; DEFAULT-NEXT: [[BIN_EXTRA]] = add i32 [[Rdx]], -5 ; DEFAULT-NEXT: [[TMP34:%.*]] = add i32 [[TMP32]], undef ; DEFAULT-NEXT: br label [[FOR_BODY]] ; @@ -162,14 +144,8 @@ define void @PR32038(i32 %n) { ; GATHER-NEXT: [[TMP5:%.*]] = insertelement <8 x i32> [[TMP4]], i32 [[TMP29]], i32 5 ; GATHER-NEXT: [[TMP6:%.*]] = insertelement <8 x i32> [[TMP5]], i32 [[TMP31]], i32 6 ; GATHER-NEXT: [[TMP7:%.*]] = insertelement <8 x i32> [[TMP6]], i32 [[TMP33]], i32 7 -; GATHER-NEXT: [[RDX_SHUF:%.*]] = shufflevector <8 x i32> [[TMP7]], <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef> -; GATHER-NEXT: [[BIN_RDX:%.*]] = add <8 x i32> [[TMP7]], [[RDX_SHUF]] -; GATHER-NEXT: [[RDX_SHUF1:%.*]] = shufflevector <8 x i32> [[BIN_RDX]], <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> -; GATHER-NEXT: [[BIN_RDX2:%.*]] = add <8 x i32> [[BIN_RDX]], [[RDX_SHUF1]] -; GATHER-NEXT: [[RDX_SHUF3:%.*]] = shufflevector <8 x i32> [[BIN_RDX2]], <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> -; GATHER-NEXT: [[BIN_RDX4:%.*]] = add <8 x i32> [[BIN_RDX2]], [[RDX_SHUF3]] -; GATHER-NEXT: [[TMP8:%.*]] = extractelement <8 x i32> [[BIN_RDX4]], i32 0 -; GATHER-NEXT: [[BIN_EXTRA]] = add i32 [[TMP8]], -5 +; GATHER-NEXT: [[Rdx:%.*]] = call i32 @llvm.experimental.vector.reduce.add.i32.v8i32(<8 x i32> [[TMP7]]) +; GATHER-NEXT: [[BIN_EXTRA]] = add i32 [[Rdx]], -5 ; GATHER-NEXT: [[TMP34:%.*]] = add i32 [[TMP32]], [[TMP33]] ; GATHER-NEXT: br label [[FOR_BODY]] ; |