Dead.push_back(std::make_pair(I, MTI));
}
} else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(U)) {
- if (CE->use_empty()) {
- CE->destroyConstant();
- Changed = true;
- } else if (isa<GEPOperator>(CE))
+ if (isa<GEPOperator>(CE))
append_range(Worklist, CE->users());
- } else if (Constant *C = dyn_cast<Constant>(U)) {
- if (isSafeToDestroyConstant(C)) {
- C->destroyConstant();
- // This could have invalidated UI, start over from scratch.
- Dead.clear();
- CleanupPointerRootUsers(GV, GetTLI);
- return true;
- }
}
}
}
}
+ GV->removeDeadConstantUsers();
return Changed;
}
--- /dev/null
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
+; RUN: opt -S -passes=globalopt < %s | FileCheck %s
+
+; Test handling of dead constant expressions in CleanupPointerRootUsers().
+
+@g = internal global [2 x [1 x [6 x ptr]]] zeroinitializer
+
+define void @test() {
+; CHECK-LABEL: define void @test() local_unnamed_addr {
+; CHECK-NEXT: ret void
+;
+ store ptr null, ptr getelementptr inbounds ([2 x [1 x [6 x ptr]]], ptr @g, i32 0, i32 1), align 1
+ ret void
+
+dead:
+ zext i1 icmp ne (ptr getelementptr inbounds ([2 x [1 x [6 x ptr]]], ptr @g, i32 0, i32 1), ptr getelementptr inbounds ([6 x ptr], ptr getelementptr inbounds ([2 x [1 x [6 x ptr]]], ptr @g, i32 0, i32 1), i32 0, i32 5)) to i16
+ ret void
+}
+
+; uselistorder directives
+uselistorder ptr getelementptr inbounds ([2 x [1 x [6 x ptr]]], ptr @g, i32 0, i32 1), { 1, 2, 0 }