diff --git a/llvm/test/Transforms/SimplifyCFG/speculate-store.ll b/llvm/test/Transforms/SimplifyCFG/speculate-store.ll index c1ac7bcea249043875cecb8225dc63d3ba63bd96..15f403ce5f53a3fcd786d0046356c3e43ac679c3 100644 --- a/llvm/test/Transforms/SimplifyCFG/speculate-store.ll +++ b/llvm/test/Transforms/SimplifyCFG/speculate-store.ll @@ -1,108 +1,87 @@ ; RUN: opt -simplifycfg -S < %s | FileCheck %s -define void @ifconvertstore(i32 %m, i32* %A, i32* %B, i32 %C, i32 %D) { +define void @ifconvertstore(i32* %A, i32 %B, i32 %C, i32 %D) { +; CHECK-LABEL: @ifconvertstore( +; CHECK: store i32 %B, i32* %A +; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 %D, 42 +; CHECK-NEXT: [[C_B:%.*]] = select i1 [[CMP]], i32 %C, i32 %B +; CHECK-NEXT: store i32 [[C_B]], i32* %A +; CHECK-NEXT: ret void +; entry: - %arrayidx = getelementptr inbounds i32, i32* %B, i64 0 - %0 = load i32, i32* %arrayidx, align 4 - %add = add nsw i32 %0, %C - %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 0 - ; First store to the location. - store i32 %add, i32* %arrayidx2, align 4 - %arrayidx4 = getelementptr inbounds i32, i32* %B, i64 1 - %1 = load i32, i32* %arrayidx4, align 4 - %add5 = add nsw i32 %1, %D - %cmp6 = icmp sgt i32 %add5, %C - br i1 %cmp6, label %if.then, label %ret.end + store i32 %B, i32* %A + %cmp = icmp sgt i32 %D, 42 + br i1 %cmp, label %if.then, label %ret.end ; Make sure we speculate stores like the following one. It is cheap compared to ; a mispredicated branch. -; CHECK-LABEL: @ifconvertstore( -; CHECK: %add5.add = select i1 %cmp6, i32 %add5, i32 %add -; CHECK: store i32 %add5.add, i32* %arrayidx2, align 4 if.then: - store i32 %add5, i32* %arrayidx2, align 4 + store i32 %C, i32* %A br label %ret.end ret.end: ret void } -define void @noifconvertstore1(i32 %m, i32* %A, i32* %B, i32 %C, i32 %D) { -entry: - %arrayidx = getelementptr inbounds i32, i32* %B, i64 0 - %0 = load i32, i32* %arrayidx, align 4 - %add = add nsw i32 %0, %C - %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 0 - ; Store to a different location. - store i32 %add, i32* %arrayidx, align 4 - %arrayidx4 = getelementptr inbounds i32, i32* %B, i64 1 - %1 = load i32, i32* %arrayidx4, align 4 - %add5 = add nsw i32 %1, %D - %cmp6 = icmp sgt i32 %add5, %C - br i1 %cmp6, label %if.then, label %ret.end +define void @noifconvertstore1(i32* %A1, i32* %A2, i32 %B, i32 %C, i32 %D) { ; CHECK-LABEL: @noifconvertstore1( ; CHECK-NOT: select +; +entry: + store i32 %B, i32* %A1 + %cmp = icmp sgt i32 %D, 42 + br i1 %cmp, label %if.then, label %ret.end + if.then: - store i32 %add5, i32* %arrayidx2, align 4 + store i32 %C, i32* %A2 br label %ret.end ret.end: ret void } +; This function could store to our address, so we can't repeat the first store a second time. declare void @unknown_fun() -define void @noifconvertstore2(i32 %m, i32* %A, i32* %B, i32 %C, i32 %D) { +define void @noifconvertstore2(i32* %A, i32 %B, i32 %C, i32 %D) { +; CHECK-LABEL: @noifconvertstore2( +; CHECK-NOT: select +; entry: - %arrayidx = getelementptr inbounds i32, i32* %B, i64 0 - %0 = load i32, i32* %arrayidx, align 4 - %add = add nsw i32 %0, %C - %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 0 - ; First store to the location. - store i32 %add, i32* %arrayidx2, align 4 + store i32 %B, i32* %A call void @unknown_fun() - %arrayidx4 = getelementptr inbounds i32, i32* %B, i64 1 - %1 = load i32, i32* %arrayidx4, align 4 - %add5 = add nsw i32 %1, %D - %cmp6 = icmp sgt i32 %add5, %C + %cmp6 = icmp sgt i32 %D, 42 br i1 %cmp6, label %if.then, label %ret.end -; CHECK-LABEL: @noifconvertstore2( -; CHECK-NOT: select if.then: - store i32 %add5, i32* %arrayidx2, align 4 + store i32 %C, i32* %A br label %ret.end ret.end: ret void } -define void @noifconvertstore_volatile(i32 %m, i32* %A, i32* %B, i32 %C, i32 %D) { -entry: - %arrayidx = getelementptr inbounds i32, i32* %B, i64 0 - %0 = load i32, i32* %arrayidx, align 4 - %add = add nsw i32 %0, %C - %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 0 +; Make sure we don't speculate volatile stores. +define void @noifconvertstore_volatile(i32* %A, i32 %B, i32 %C, i32 %D) { +; CHECK-LABEL: @noifconvertstore_volatile( +; CHECK-NOT: select +; +entry: ; First store to the location. - store i32 %add, i32* %arrayidx2, align 4 - %arrayidx4 = getelementptr inbounds i32, i32* %B, i64 1 - %1 = load i32, i32* %arrayidx4, align 4 - %add5 = add nsw i32 %1, %D - %cmp6 = icmp sgt i32 %add5, %C + store i32 %B, i32* %A + %cmp6 = icmp sgt i32 %D, 42 br i1 %cmp6, label %if.then, label %ret.end -; Make sure we don't speculate volatile stores. -; CHECK-LABEL: @noifconvertstore_volatile( -; CHECK-NOT: select if.then: - store volatile i32 %add5, i32* %arrayidx2, align 4 + store volatile i32 %C, i32* %A br label %ret.end ret.end: ret void } +