[llvm] r257087 - [SCCP] Can't go from overdefined to constant

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 7 11:25:40 PST 2016


Author: majnemer
Date: Thu Jan  7 13:25:39 2016
New Revision: 257087

URL: http://llvm.org/viewvc/llvm-project?rev=257087&view=rev
Log:
[SCCP] Can't go from overdefined to constant

The fix for PR23999 made us mark loads of null as producing the constant
undef which upsets the lattice.  Instead, keep the load as "undefined".
This fixes PR26044.

Added:
    llvm/trunk/test/Transforms/IPConstantProp/PR26044.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/SCCP.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/SCCP.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SCCP.cpp?rev=257087&r1=257086&r2=257087&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SCCP.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SCCP.cpp Thu Jan  7 13:25:39 2016
@@ -1047,7 +1047,7 @@ void SCCPSolver::visitStoreInst(StoreIns
 // global, we can replace the load with the loaded constant value!
 void SCCPSolver::visitLoadInst(LoadInst &I) {
   // If this load is of a struct, just mark the result overdefined.
-  if (I.getType()->isStructTy())
+  if (I.getType()->isStructTy() || I.getType()->isMMXTy())
     return markAnythingOverdefined(&I);
 
   LatticeVal PtrVal = getValueState(I.getOperand(0));
@@ -1061,9 +1061,9 @@ void SCCPSolver::visitLoadInst(LoadInst
 
   Constant *Ptr = PtrVal.getConstant();
 
-  // load null -> null
+  // load null is undefined.
   if (isa<ConstantPointerNull>(Ptr) && I.getPointerAddressSpace() == 0)
-    return markConstant(IV, &I, UndefValue::get(I.getType()));
+    return;
 
   // Transform load (constant global) into the value loaded.
   if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Ptr)) {

Added: llvm/trunk/test/Transforms/IPConstantProp/PR26044.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IPConstantProp/PR26044.ll?rev=257087&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/IPConstantProp/PR26044.ll (added)
+++ llvm/trunk/test/Transforms/IPConstantProp/PR26044.ll Thu Jan  7 13:25:39 2016
@@ -0,0 +1,31 @@
+; RUN: opt < %s -S -ipsccp | FileCheck %s
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @fn2() {
+entry:
+  br label %if.end
+
+for.cond1:                                        ; preds = %if.end, %for.end
+  br i1 undef, label %if.end, label %if.end
+
+if.end:                                           ; preds = %lbl, %for.cond1
+  %e.2 = phi i32* [ undef, %entry ], [ null, %for.cond1 ], [ null, %for.cond1 ]
+  %0 = load i32, i32* %e.2, align 4
+  %call = call i32 @fn1(i32 %0)
+  br label %for.cond1
+}
+
+define internal i32 @fn1(i32 %p1) {
+entry:
+  %tobool = icmp ne i32 %p1, 0
+  %cond = select i1 %tobool, i32 %p1, i32 %p1
+  ret i32 %cond
+}
+
+; CHECK-LABEL: define void @fn2(
+; CHECK: call i32 @fn1(i32 undef)
+
+; CHECK-LABEL: define internal i32 @fn1(
+; CHECK:%[[COND:.*]] = select i1 undef, i32 undef, i32 undef
+; CHECK: ret i32 %[[COND]]




More information about the llvm-commits mailing list