[llvm] r271150 - [ValueTracking] ICmp instructions propagate poison
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Sat May 28 17:31:27 PDT 2016
Author: sanjoy
Date: Sat May 28 19:31:18 2016
New Revision: 271150
URL: http://llvm.org/viewvc/llvm-project?rev=271150&view=rev
Log:
[ValueTracking] ICmp instructions propagate poison
This is a stripped down version of D19211, leaving out the questionable
"branching in poison is UB" bit.
Modified:
llvm/trunk/lib/Analysis/ValueTracking.cpp
llvm/trunk/test/Analysis/ScalarEvolution/flags-from-poison.ll
Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=271150&r1=271149&r2=271150&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
+++ llvm/trunk/lib/Analysis/ValueTracking.cpp Sat May 28 19:31:18 2016
@@ -3477,6 +3477,11 @@ bool llvm::propagatesFullPoison(const In
return false;
}
+ case Instruction::ICmp:
+ // Comparing poison with any value yields poison. This is why, for
+ // instance, x s< (x +nsw 1) can be folded to true.
+ return true;
+
case Instruction::GetElementPtr:
// A GEP implicitly represents a sequence of additions, subtractions,
// truncations, sign extensions and multiplications. The multiplications
Modified: llvm/trunk/test/Analysis/ScalarEvolution/flags-from-poison.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/flags-from-poison.ll?rev=271150&r1=271149&r2=271150&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/flags-from-poison.ll (original)
+++ llvm/trunk/test/Analysis/ScalarEvolution/flags-from-poison.ll Sat May 28 19:31:18 2016
@@ -57,6 +57,30 @@ exit:
ret void
}
+define void @test-add-nuw-from-icmp(float* %input, i32 %offset,
+ i32 %numIterations) {
+; CHECK-LABEL: @test-add-nuw-from-icmp
+entry:
+ br label %loop
+loop:
+ %i = phi i32 [ %nexti, %loop ], [ 0, %entry ]
+
+; CHECK: %index32 =
+; CHECK: --> {%offset,+,1}<nuw>
+ %index32 = add nuw i32 %i, %offset
+ %cmp = icmp sgt i32 %index32, 0
+ %cmp.idx = sext i1 %cmp to i32
+
+ %ptr = getelementptr inbounds float, float* %input, i32 %cmp.idx
+ %nexti = add nuw i32 %i, 1
+ %f = load float, float* %ptr, align 4
+ %exitcond = icmp eq i32 %nexti, %numIterations
+ br i1 %exitcond, label %exit, label %loop
+
+exit:
+ ret void
+}
+
; With no load to trigger UB from poison, we cannot infer nsw.
define void @test-add-no-load(float* %input, i32 %offset, i32 %numIterations) {
; CHECK-LABEL: @test-add-no-load
More information about the llvm-commits
mailing list