[PATCH] D41554: [InstSimplify] Missed optimization in math expression: (x+x)/x == 2

David Majnemer via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Dec 23 19:15:37 PST 2017


majnemer added inline comments.


================
Comment at: lib/Analysis/InstructionSimplify.cpp:997
+  if ((IsSigned && match(Op0, m_NSWShl(m_Specific(Op1), m_One()))) ||
+      (!IsSigned && match(Op0, m_Shl(m_Specific(Op1), m_One())))) {
+    return ConstantInt::get(Op0->getType(), 2);
----------------
I believe this needs to be m_NUWShl.


================
Comment at: test/Transforms/InstSimplify/div.ll:147-154
+define i32 @udiv_doublex_x(i32 %x) {
+; CHECK-LABEL: @udiv_doublex_x(
+; CHECK-NEXT:    ret i32 2
+;
+  %add = shl i32 %x, 1
+  %div = udiv i32 %add, %x
+  ret i32 %div
----------------
This seems wrong as per https://www.rise4fun.com/Alive/Gslf


> ERROR: Mismatch in values of i32 %div
> 
> Example:
> %x i32 = 0x800FE842 (2148526146, -2146441150)
> %add i32 = 0x001FD084 (2084996)
> Source value: 0x00000000 (0)
> Target value: 0x00000002 (2)




https://reviews.llvm.org/D41554





More information about the llvm-commits mailing list